我使用NSCondition類在此SENCE: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。我希望當調用[cocoaCondition wait]
時,線程1將被阻塞。然後,當thread2調用[cocoaCondition signal]
時,thread1將繼續運行。我已經測試了代碼,並且正如我所希望的那樣工作。
但是,正如你看到的,當代碼運行:
步驟1中,線程1調用:[cocoaCondition lock]
(蘋果醫生說:試圖獲取一個鎖,阻塞線程的執行,直到鎖可收購)
步驟2中,線程1調用:[cocoaCondition wait]
步驟3中,線程2調用:[cocoaCondition lock]
(繼蘋果的doc,該線程2應被阻止)
步驟4中,線程2調用:[cocoaCondition signal]
(所以,線程2應該被阻塞,可以」 t調用這個方法直到[cocoaConditon unlock]
被稱爲)
我想我的代碼是死鎖的,但爲什麼不呢? 所以我猜可可條件是解鎖當thread1在步驟2調用[cocoaCondition wait]
,是嗎?
爲什麼你需要while循環?你不能等待,然後一旦信號被稱爲等待將退出? – jjxtra 2012-12-12 19:58:40
@jjxtra來自Apple的NSCondition doc:「由於信令的工作方式,布爾謂詞是使用條件的語義的一個重要部分,發送條件並不能保證條件本身是真實的。可能會導致出現錯誤信號。「 – Gobe 2016-06-03 18:22:22