NSCondition如何运作?

时间:2011-12-23 03:31:07

标签: iphone multithreading locking unlock

我正在使用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];
}

我有两个线程,thread1运行method1,thread2运行method2。我希望在调用[cocoaCondition wait]时,将阻止thread1。然后当thread2调用[cocoaCondition signal]时,thread1将恢复运行。我测试了代码,它正如我希望的那样工作。

但是,如您所见,当代码运行时:

第1步,thread1调用:[cocoaCondition lock](Apple doc说:尝试获取锁定,阻止线程执行直到可以获取锁定)

第2步,thread1调用:[cocoaCondition wait]
第3步,thread2调用:[cocoaCondition lock](遵循apple的doc,thread2应该被阻止)
步骤4,thread2调用:[cocoaCondition signal](因此,应该阻止thread2,并且在调用[cocoaConditon unlock]之前不能调用此方法)

我认为我的代码已陷入僵局,但为什么不呢? 所以我想当thread1在第2步调用[cocoaCondition wait]时,cocoaCondition被解锁了,是吗?

1 个答案:

答案 0 :(得分:6)

NSCondition Class Reference

文档说:“当一个线程等待条件时,条件对象解锁其锁定并阻塞线程。当条件被发出信号时,系统唤醒线程。条件对象然后在返回之前重新获取其锁定wait或waitUntilDate:方法。因此,从线程的角度来看,就好像它始终保持锁定一样。“

你的猜测是正确的。