3

我在这个意义上使用 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步,线程1调用:[cocoaCondition wait]
第3步,线程2调用:([cocoaCondition lock]按照苹果的文档,线程2应该被阻塞)
第4步,线程2调用:([cocoaCondition signal]所以,线程2应该被阻塞,直到被调用才能调用这个方法[cocoaConditon unlock]

我认为我的代码死锁了,但为什么不呢?所以我猜当thread1调用第2步时cocoaCondition被解锁了[cocoaCondition wait],是吗?

4

1 回答 1

8

NSCondition 类参考

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

你的猜测是对的。

于 2012-04-11T02:39:08.213 回答