【问题标题】:How does the NSCondition work?NSCondition 是如何工作的?
【发布时间】:2011-12-23 03:31:06
【问题描述】:

我在这个意义上使用 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 文档说:尝试获取锁,阻塞线程的执行直到可以获取锁)

第 2 步,thread1 调用:[cocoaCondition wait]
第三步,thread2调用:[cocoaCondition lock](按照苹果的文档,thread2应该被阻塞)
第4步,thread2调用:[cocoaCondition signal](所以,thread2应该被阻塞,直到[cocoaConditon unlock]被调用才能调用这个方法)

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

【问题讨论】:

  • 为什么需要while循环?难道你不能只调用等待,然后一旦调用信号等待就会退出?
  • @jjxtra 来自 Apple 的 NSCondition 文档:“布尔谓词是使用条件语义的重要组成部分,因为信号的工作方式。发出条件信号并不能保证条件本身为真。有是信号中涉及的时间问题,可能导致出现错误信号。”

标签: iphone multithreading locking unlock


【解决方案1】:

NSCondition Class Reference

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

你猜对了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-11-13
    • 2017-10-11
    • 2021-10-13
    相关资源
    最近更新 更多