2013-06-12 52 views
2

我在使用時,信號用值大於0IOS信號燈的等待不會等待

sema = dispatch_semaphore_create(2); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //signals here 
}); 

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
dispatch_release(sema); 

不應該等待必須等待創建dispatch_semaphore_wait(..)問題兩個信號? 在上面的代碼中,它不會等待,所以釋放被調用,結果是崩潰!

回答

4

沒有,這不是它是如何工作的。線程將在第三次等待時阻塞,直到前兩個信號中的一個發出信號。這是一個系統來指定有多少線程可以一次訪問資源。更多信息here

如果您想以您描述的方式等待,我認爲您可以使用NSCondition類。

5

使用調度組而不是信號量來獲取此行爲。

通過在開始任務前調用dispatch_group_enter()兩次將組初始化爲2,dispatch_group_wait()將在返回前等待兩個調用dispatch_group_leave()