5

如何確定dispatch_semaphore_t是否在等待時等待?我最初想:如何確定是否正在等待調度信號量?

if (dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW)) { 
    NSLog(@"No more resources, wait"); 
} else { 
    NSLog(@"Resources available, shouldn't wait"); 
} 

但是這樣做dispatch_semaphore_wait()信號燈的行爲是遞減所以後來我就在想:

if (dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW)) { 
    NSLog(@"No more resources, wait"); 
} else { 
    dispatch_semaphore_signal(mySemaphore); 
    NSLog(@"Resources available, shouldn't wait"); 
} 

尚未遞減信號量的最終結果,但是看起來像一個黑客,建議?

編輯

由於我打字了我在做什麼,我是如何來到這個結論,我意識到,我確實想解決的方法不對,我只是想知道,如果我是等待資源並能夠向用戶顯示「等待」對話框。我覺得這是做了正確方式

+1

這是無法完成的(至少不可靠),並且您想要這樣做的事實表明設計錯誤。我加入@das問道:你在高度抽象層面上想做什麼?什麼情況會讓你覺得你想知道信號量是否在等待? – 2013-04-03 23:24:35

+0

@KenThomases你說得對,我以錯誤的方式來到這裏,我編輯了更好的解決方案。 – Shizam 2013-04-03 23:38:44

回答

4

dispatch_semaphore_wait()如果它返回0

只遞減信號量的值如果超時期滿(即它返回非零值)時,信號值沒有減少。

將成功案例中的減量看作是獲取由計數信號量管理的資源之一的所有權,如果在成功等待後立即發出信號,則表示您已立即停止使用該資源,即想必不是你想要的。

你想做什麼?

+0

將此標記爲解決方案,因爲@ das的陳述是正確的,並且我以這種錯誤方式進入:) – Shizam 2013-04-03 23:39:36

+1

爲什麼地球上不能爲dispatch_semaphore_wait()指定此行爲 - 它完全沒有提到信號值如果超時已過並且資源已被佔用,則不會減量。然而,優秀的答案 - 我可以證實這種情況,信號量遞減只發生在對'DISPATCH_TIME_NOW'返回0的測試中。在非零情況下,您不需要'dispatch_semaphore_signal()'。謝謝! – 2013-07-03 10:46:55

+0

@ rob-glassey在這一點上沒有證據表明文檔不足,請提交[bug](http://bugreport.apple.com)! – das 2013-07-03 22:14:26