2011-12-23 46 views
2

我使用NSCondition类在此SENCE:NSCondition是如何工作的?

- (void) method1 
{ 
    [[cocoaCondition lock] lock]; 
    while (!someCheckIsTrue) { 
     [cocoaCondition wait]; 
    } 
    // Do something. 
    [cocoaCondition unlock]; 
} 

- (void) method2 
{ 
    [cocoaCondition lock]; 
    // Do something. 
    someCheckIsTrue = YES; 
    [cocoaCondition signal]; 
    [cocoaCondition unlock]; 
} 

我有两个线程,线程1运行方法1及线程运行的方法2。我希望当调用[cocoaCondition wait]时,线程1将被阻塞。然后,当thread2调用[cocoaCondition signal]时,thread1将继续运行。我已经测试了代码,并且正如我所希望的那样工作。

但是,正如你看到的,当代码运行:

步骤1中,线程1调用:[cocoaCondition lock](苹果医生说:试图获取一个锁,阻塞线程的执行,直到锁可收购)

步骤2中,线程1调用:[cocoaCondition wait]
步骤3中,线程2调用:[cocoaCondition lock](继苹果的doc,该线程2应被阻止)
步骤4中,线程2调用:[cocoaCondition signal](所以,线程2应该被阻塞,可以” t调用这个方法直到[cocoaConditon unlock]被称为)

我想我的代码是死锁的,但为什么不呢? 所以我猜可可条件是解锁当thread1在步骤2调用[cocoaCondition wait],是吗?

+1

为什么你需要while循环?你不能等待,然后一旦信号被称为等待将退出? – jjxtra 2012-12-12 19:58:40

+0

@jjxtra来自Apple的NSCondition doc:“由于信令的工作方式,布尔谓词是使用条件的语义的一个重要部分,发送条件并不能保证条件本身是真实的。可能会导致出现错误信号。“ – Gobe 2016-06-03 18:22:22

回答

4

NSCondition Class Reference

的文件说:“当上的状态的线程等待,条件对象解锁其锁定和阻止该线程当该条件获得信号时,系统被唤醒线程的条件对象然后。在从wait或waitUntilDate:方法返回之前重新获取它的锁。因此,从线程的角度来看,它好像总是持有锁。

你的猜测是对的。