Iphone 这个条件是如何工作的?
我在这个意义上使用了NSCondition类:Iphone 这个条件是如何工作的?,iphone,multithreading,locking,unlock,Iphone,Multithreading,Locking,Unlock,我在这个意义上使用了NSCondition类: - (void) method1 { [[cocoaCondition lock] lock]; while (!someCheckIsTrue) { [cocoaCondition wait]; } // Do something. [cocoaCondition unlock]; } - (void) method2 { [cocoaCondition lock]; //
- (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信号]
时,thread1将恢复运行。我已经测试了代码,它就像我希望的那样工作
但是,正如您所看到的,当代码运行时:
步骤1,thread1调用:[cocoaCondition lock]
(苹果文档中说:尝试获取锁,阻止线程执行,直到可以获取锁为止)
步骤2,thread1调用:[cocoaCondition wait]
步骤3,thread2调用:
[cocoaCondition lock]
(根据苹果的文档,thread2应该被阻止)步骤4,thread2调用:
[cocoaCondition signal]
(因此,thread2应该被阻止,并且在调用[cocoaCondition unlock]
之前不能调用此方法)
我想我的代码已经死锁了,但为什么不呢?
因此,我猜当thread1在步骤2中调用[cocoacdition wait]
时,cocoacdition是解锁的,是吗?
文件说:当线程等待某个条件时,条件对象将解锁其锁并阻止线程。当条件发出信号时,系统唤醒线程。然后,condition对象在从wait或waitUntilDate:方法返回之前重新获取其锁。因此,从线程的角度来看,它似乎总是持有锁。”
你的猜测是对的。为什么你需要while循环?难道你不能直接调用wait,然后一旦信号被调用wait就会退出吗?@jjxtra来自苹果的NSCondition文档:“布尔谓词是使用条件语义的重要部分,因为信号的工作方式。发出条件信号并不保证条件本身为真。信号中存在可能导致出现虚假信号的定时问题。”