NSCondition或@synchronized

时间:2013-04-22 10:21:15

标签: ios objective-c locking

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

我有这段代码:

@interface ServerManager()
{
    NSCondition* statusLock;

[ ... ]

}

@end

@implementation ServerManager

[ ... ]

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

    status = newStatus;

    [statusLock unlock];
}

如果我用这个改变- (void)setStatus:(ServerStatus)newStatus实施:

- (void)setStatus:(ServerStatus)newStatus
{
    @synchronized(statusLock)
    {
        status = newStatus;
    }
}

我也这样做吗?

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

1 个答案:

答案 0 :(得分:2)

我的理解是这两段代码等价 - 为了与NSCondition@synchronized做同样的事情,你必须写得很明显更多代码。根据{{​​3}}的概述部分,使用setStatus的{​​{1}}实施应该如下所示:

NSCondition

如果您只需要防止并发修改,使用- (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]; } 看起来就像一个更简单的选项。