我正在使用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 doc说:尝试获取锁定,阻止线程执行直到可以获取锁定)
第2步,thread1调用:[cocoaCondition wait]
第3步,thread2调用:[cocoaCondition lock]
(遵循apple的doc,thread2应该被阻止)
步骤4,thread2调用:[cocoaCondition signal]
(因此,应该阻止thread2,并且在调用[cocoaConditon unlock]
之前不能调用此方法)
我认为我的代码已陷入僵局,但为什么不呢?
所以我想当thread1在第2步调用[cocoaCondition wait]
时,cocoaCondition被解锁了,是吗?
答案 0 :(得分:6)
文档说:“当一个线程等待条件时,条件对象解锁其锁定并阻塞线程。当条件被发出信号时,系统唤醒线程。条件对象然后在返回之前重新获取其锁定wait或waitUntilDate:方法。因此,从线程的角度来看,就好像它始终保持锁定一样。“
你的猜测是正确的。