5

W jaki sposób można ustalić, czy dispatch_semaphore_t oczekuje na w/out powodując oczekiwanie? I początkowo myślał:Jak ustalić, czy jest oczekiwany semafor wysyłkowy?

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

ale akt robi dispatch_semaphore_wait() semafor jest zmniejszany tak wtedy myślałem:

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

który ma wynik końcowy nie odlicza semafora, ale wydaje się, hack , propozycje?

EDIT

Jak pisałem, co robię i jak doszedłem do tego wniosku, zdałem sobie sprawę, że rzeczywiście myśli o rozwiązanie w niewłaściwy sposób, chciałem tylko wiedzieć, czy jestem oczekiwanie na zasób i możliwość wyświetlenia użytkownikowi okna dialogowego "oczekiwania". Myślę, że to jest właściwa drogato zrobić:

+1

Nie można tego zrobić (przynajmniej niezawodnie), a fakt, że chcesz to zrobić, sugeruje błąd projektowy. Dołączam do @das pytając: co próbujesz zrobić na wysokim poziomie abstrakcji? Jaka sytuacja sprawia, że ​​myślisz, że chcesz wiedzieć, czy semafor jest wyczekiwany? –

+0

@KenThomases Masz rację, podchodziłem do tego w niewłaściwy sposób, I Zredagowałem w lepszym rozwiązaniu. – Shizam

Odpowiedz

4

dispatch_semaphore_wait() została zmniejszona wartość semafora tylko wtedy, gdy zwraca 0.

Jeżeli upłynął limit czasu (tj zwraca niezerowy), przy czym wartość semafora NIE została zmniejszona.

Pomyśl o tym, że ubytek w przypadku sukcesu oznacza przejęcie na własność jednego z zasobów zarządzanych przez semafor zliczający, jeśli zasygnalizujesz natychmiast po pomyślnym oczekiwaniu, wskażesz, że od razu przestałeś używać tego zasobu, co jest prawdopodobnie nie tego, co chcesz.

Co próbujesz zrobić?

+0

Oznaczanie tego jako rozwiązania jako oświadczenia @ das są poprawne I podchodziłem do tego w niewłaściwy sposób :) – Shizam

+1

Dlaczego na ziemi nie może dokumentacja określić tego zachowania dla 'dispatch_semaphore_wait()' - nie mówi absolutnie nic na temat wartości semafora NIE jest zmniejszany, jeśli upłynął limit czasu, a zasób jest już zajęty. Jednak doskonała odpowiedź - mogę to potwierdzić, dekodowanie semaforów dzieje się tylko wtedy, gdy testowanie z 'DISPATCH_TIME_NOW' zwraca 0. Nie musisz' dispatch_semaphore_signal() 'w przypadku niezerowym. Dziękuję Ci! –

+0

@ rob-glassey brak argumentu, że dokumentacja jest niedostateczna w tej kwestii, prosimy o zgłoszenie [błędu] (http://bugreport.apple.com)! – das

Powiązane problemy