首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCondition锁的工作

NSCondition锁的工作
EN

Stack Overflow用户
提问于 2015-03-04 09:29:01
回答 1查看 2.3K关注 0票数 3

我最近一直在使用NSCondition,我真的不明白锁和解锁部分。

例如,

代码语言:javascript
复制
NSCondition lock = [NSCondition new];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Do stuff
    [lock signal];
};

[lock wait];
//Do rest

这很好用。这有什么区别呢..。

代码语言:javascript
复制
NSCondition lock = [[NSCondition alloc] init];
[lock lock];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Do stuff
    [lock signal];
    [lock unlock];
};

[lock wait];
//Do rest
EN

回答 1

Stack Overflow用户

发布于 2015-03-04 09:41:32

在等待之前,您必须持有条件变量的锁。等待释放锁,然后保证阻塞,直到它已经发出信号,锁已被重取。请注意,如果多个线程正在等待,则只有一个线程将被通知信号,其他线程将继续等待进一步的信号。或者,如果谓词在执行后将保持为真,则信号可以广播到所有线程。

锁是互斥锁(互斥锁),这意味着任何时候只有一个线程可以持有锁。除了使用它来保护您所使用的条件变量之外,它还保护条件变量的内部工作。如果您试图在不使用锁的情况下使用它,则在跨多个线程检查/设置条件时会出现争用条件。

为了正确使用条件变量,您的两个示例都不正确。重点是保护谓词的状态。下面是一个基于文献资料伪代码的示例。

代码语言:javascript
复制
NSCondition condvar = [NSCondition new];
__block BOOL workRequired = NO;

// something somewhere else does this at some point ^{
    [condvar lock];
    workRequired = YES;
    [condvar signal];
    [condvar unlock];
};

[condvar lock];

while (!workRequired) {
    [condvar wait];
}

// Do the work
workRequired = NO;
[condvar unlock];

在您的示例中,除了“已完成的块”之外,您没有任何条件。在这种情况下,您应该只使用dispatch_sync。

代码语言:javascript
复制
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Do stuff
};

// Do rest

如果出于某种原因,您不知道是否已经在该队列上运行,那么信号量就足够了。

代码语言:javascript
复制
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0L);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Do stuff
    dispatch_semaphore_signal(semaphore);
};

dispatch_semaphore_wait(semaphore);
// Do rest
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28850815

复制
相关文章

相似问题

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