5

Wie können Sie feststellen, ob auf eine dispatch_semaphore_t gewartet wird, ohne dass eine Wartezeit aufgetreten ist? Ich war anfangs dachte:Wie kann festgestellt werden, ob auf einen Versand-Semaphor gewartet wird?

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

Aber der Akt der dispatch_semaphore_wait() die Semaphore tun verringert wird so dann dachte ich:

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

, die das Endergebnis nicht Erniedrigen des Semaphore hat aber scheint wie ein Hack , Vorschläge?

EDIT

Als ich die Eingabe aus, was ich tue und wie ich zu diesem Schluss kam erkannte ich, dass ich in der Tat über die Lösung dachte falsch, ich wollte nur wissen, ob ich war Warten auf eine Ressource und in der Lage sein, einen "Warte" -Dialog für den Benutzer anzuzeigen. Ich denke, das ist die richtige Weg, es zu tun:

+1

Dies ist nicht möglich (zumindest nicht zuverlässig) und die Tatsache, dass Sie es tun möchten, deutet auf einen Konstruktionsfehler hin. Ich schließe mich @das an und frage: Was versuchst du auf hohem Abstraktionsniveau zu tun? Welche Situation lässt Sie denken, dass Sie wissen wollen, ob ein Semaphor gewartet wird? –

+0

@KenThomases Du hast Recht, ich kam auf dem falschen Weg, ich bearbeitete die bessere Lösung. – Shizam

Antwort

4

dispatch_semaphore_wait() hat erniedrigt nur die Semaphore Wert, wenn es 0

zurück, wenn das Timeout abgelaufen ist (dh nicht-Null zurückgibt), die Semaphorwert wurde NICHT dekrementiert.

Denken Sie an das Dekrement im Erfolgsfall, wenn Sie Besitz einer der vom Zählsemaphor verwalteten Ressourcen übernehmen. Wenn Sie direkt nach einer erfolgreichen Wartezeit signalisieren, würden Sie angeben, dass Sie diese Ressource sofort nicht mehr verwenden vermutlich nicht was du willst.

Was möchten Sie tun?

+0

Markieren Sie dies als die Lösung als @ das Aussagen sind richtig und ich kam auf die falsche Weise :) – Shizam

+1

Warum in der Dokumentation kann dieses Verhalten für 'dispatch_semaphore_wait()' nicht angeben - es sagt absolut nichts über den Semaphor-Wert Wird nicht dekrementiert, wenn das Zeitlimit abgelaufen ist und die Ressource bereits belegt ist. Aber ausgezeichnete Antwort - ich kann bestätigen, dass dies der Fall ist, das Semaphor-Dekrement passiert nur, wenn das Testen gegen 'DISPATCH_TIME_NOW' 0 zurückgibt. Sie müssen nicht 'dispatch_semaphore_signal()' im Nicht-Null-Fall. Vielen Dank! –

+0

@ rob-glassey kein Argument, dass die Dokumentation in diesem Punkt mangelhaft ist, bitte einen [Bug] (http://bugreport.apple.com)! – das