在这个意义上,我使用了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] (苹果文档说:尝试获取锁,阻止线程执行,直到获得锁为止)
步骤2,thread1调用:[cocoaCondition wait]
步骤3,thread2调用:[cocoaCondition lock] (按照苹果的文档,thread2应该被屏蔽)
步骤4,thread2调用:[cocoaCondition signal](因此,thread2应该被阻塞,并且在调用[cocoaConditon unlock]之前不能调用此方法)
我想我的代码是死锁的,但为什么不呢?因此,我猜测当thread1在步骤2上调用[cocoaCondition wait]时,cocoaCondition是解锁的,是吗?
发布于 2012-04-11 10:39:08
文档说:“当线程等待一个条件时,条件对象解锁它的锁并阻塞线程。当条件被通知时,系统唤醒线程。然后条件对象在从wait或waitUntilDate:方法返回之前重新获得它的锁。因此,从线程的角度来看,它好像总是持有锁。”
你猜对了。
https://stackoverflow.com/questions/8611994
复制相似问题