首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCondition或@同步

NSCondition或@同步
EN

Stack Overflow用户
提问于 2013-04-22 10:21:15
回答 1查看 647关注 0票数 2

我正在用最新的SDK开发一个iOS 5.0+应用程序。

我有这样的代码:

代码语言:javascript
复制
@interface ServerManager()
{
    NSCondition* statusLock;

[ ... ]

}

@end

@implementation ServerManager

[ ... ]

- (void)setStatus:(ServerStatus)newStatus
{
    [statusLock lock];

    status = newStatus;

    [statusLock unlock];
}

如果我用这个来更改- (void)setStatus:(ServerStatus)newStatus实现:

代码语言:javascript
复制
- (void)setStatus:(ServerStatus)newStatus
{
    @synchronized(statusLock)
    {
        status = newStatus;
    }
}

我在做同样的事吗?

这是我第一次使用NSThread,我不知道锁是如何在iOS上工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-22 10:32:33

我的理解是,这两段代码是不等价的-为了在NSCondition@synchronized中做同样的事情,您必须编写更多的代码。根据文档的概述部分,使用NSConditionsetStatus实现应该如下所示:

代码语言:javascript
复制
- (void)setStatus:(ServerStatus)newStatus
{
    static BOOL safe_to_set_status = YES;
    [statusLock lock];
    while (!safe_to_set_status) {
        [statusLock wait];
    }
    safe_to_set_status = NO;
    status = newStatus;
    safe_to_set_status = YES;
    [statusLock signal];
    [statusLock unlock];
}

如果您所需要的只是防止并发修改,那么使用@synchronized似乎是一个简单得多的选项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16144709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档