NSCondition是如何工作的?

4
我正在使用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。我希望当调用时,线程1会被阻塞。然后当线程2调用时,线程1将恢复运行。我已经测试了代码,它的效果正如我所希望的。
但是,正如你所看到的,当代码运行时:
步骤1,线程1调用:(Apple文档说:尝试获取锁定,阻止线程的执行直到可以获得锁定)
步骤2,线程1调用: 步骤3,线程2调用:(根据苹果的文档,线程2应该被阻塞) 步骤4,线程2调用:(因此,线程2应该被阻塞,直到调用为止)
我认为我的代码出现了死锁,但为什么不是呢? 所以我猜测当线程1在步骤2上调用时,cocoaCondition被解锁了,是吗?

1
为什么需要while循环?你不能只调用wait,一旦signal被调用,wait就会退出吗? - jjxtra
1
来自苹果NSCondition文档的@jjxtra:“布尔谓词是使用条件语义的重要部分,因为信号传递的方式。发出条件信号并不保证条件本身为真。在发出信号时涉及到时间问题,可能会导致假信号出现。” - Gobe
1个回答

8

NSCondition类参考

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

你的猜测是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接