我在这个意义上使用 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/