我正在用最新的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上工作的。
发布于 2013-04-22 10:32:33
我的理解是,这两段代码是不等价的-为了在NSCondition和@synchronized中做同样的事情,您必须编写更多的代码。根据文档的概述部分,使用NSCondition的setStatus实现应该如下所示:
- (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似乎是一个简单得多的选项。
https://stackoverflow.com/questions/16144709
复制相似问题