我最近一直在使用NSCondition,我真的不明白锁和解锁部分。
例如,
NSCondition lock = [NSCondition new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Do stuff
[lock signal];
};
[lock wait];
//Do rest这很好用。这有什么区别呢..。
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发布于 2015-03-04 09:41:32
在等待之前,您必须持有条件变量的锁。等待释放锁,然后保证阻塞,直到它已经发出信号,锁已被重取。请注意,如果多个线程正在等待,则只有一个线程将被通知信号,其他线程将继续等待进一步的信号。或者,如果谓词在执行后将保持为真,则信号可以广播到所有线程。
锁是互斥锁(互斥锁),这意味着任何时候只有一个线程可以持有锁。除了使用它来保护您所使用的条件变量之外,它还保护条件变量的内部工作。如果您试图在不使用锁的情况下使用它,则在跨多个线程检查/设置条件时会出现争用条件。
为了正确使用条件变量,您的两个示例都不正确。重点是保护谓词的状态。下面是一个基于文献资料伪代码的示例。
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。
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do stuff
};
// Do rest如果出于某种原因,您不知道是否已经在该队列上运行,那么信号量就足够了。
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 resthttps://stackoverflow.com/questions/28850815
复制相似问题