【发布时间】: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