2011-12-23 70 views
2

我使用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],是嗎?

+1

爲什麼你需要while循環?你不能等待,然後一旦信號被稱爲等待將退出? – jjxtra 2012-12-12 19:58:40

+0

@jjxtra來自Apple的NSCondition doc:「由於信令的工作方式,布爾謂詞是使用條件的語義的一個重要部分,發送條件並不能保證條件本身是真實的。可能會導致出現錯誤信號。「 – Gobe 2016-06-03 18:22:22

回答

4

NSCondition Class Reference

的文件說:「當上的狀態的線程等待,條件對象解鎖其鎖定和阻止該線程當該條件獲得信號時,系統被喚醒線程的條件對象然後。在從wait或waitUntilDate:方法返回之前重新獲取它的鎖。因此,從線程的角度來看,它好像總是持有鎖。

你的猜測是對的。