我在这个意义上使用 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 运行方法 2。我希望在调用 [cocoaCondition wait] 时,thread1 会被阻塞。然后当 thread2 调用 [cocoaCondition signal] 时,thread1 将恢复运行。我已经测试了代码,它按我希望的那样工作。

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

step 1,thread1调用:[cocoaCondition lock](苹果文档说:尝试获取锁,阻塞线程的执行,直到可以获取锁)

第二步,thread1调用:[cocoaCondition wait]step 3,thread2调用:[cocoaCondition lock](按照apple的文档,thread2应该被阻塞了)
step 4,thread2调用:[cocoaCondition signal](所以,thread2应该被阻塞,在调用[cocoaConditon unlock]之前不能调用这个方法)

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

最佳答案

NSCondition Class Reference

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

你的猜测是对的。

关于iphone - NSCondition 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8611994/

10-11 21:21