5

Come è possibile determinare se un dispatch_semaphore_t è in attesa su w/out causando un'attesa su di esso? Inizialmente ero pensando:Come determinare se è in attesa un semaforo di invio?

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

Ma l'atto di fare dispatch_semaphore_wait() il semaforo è decrementato così poi ho pensato:

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

che ha il risultato finale non decremento del semaforo, ma sembra un hack , suggerimenti?

EDIT

Mentre stavo scrivendo che cosa sto facendo e come sono arrivato a questa conclusione mi sono reso conto che stavo davvero pensando la soluzione nel modo sbagliato, volevo solo sapere se ero in attesa di una risorsa ed essere in grado di mostrare una finestra di dialogo di 'attesa' all'utente. Credo che questo sia il corretta modo per farlo:

+1

Questo non può essere fatto (almeno non in modo affidabile) e il fatto che si desideri farlo suggerisce un errore di progettazione. Mi unisco a @das nel chiedere: cosa stai cercando di fare ad un alto livello di astrazione? Quale situazione ti fa pensare di voler sapere se un semaforo viene atteso? –

+0

@KenThomases Hai ragione, stavo arrivando a questo nel modo sbagliato, ho redatto la soluzione migliore. – Shizam

risposta

4

dispatch_semaphore_wait() è decrementato solo il valore del semaforo se restituisce 0.

Se il timeout scaduto (cioè restituisce non-zero), il il valore del semaforo NON è stato decrementato.

Pensa al decremento nel caso di successo come l'acquisizione della proprietà di una delle risorse gestite dal semaforo di conteggio, se hai segnalato subito dopo un'attesa andata a buon fine, indicherai che hai smesso di usare quella risorsa subito, che è presumibilmente non quello che vuoi.

Che cosa stai cercando di fare?

+0

Contrassegnare questo come la soluzione come le dichiarazioni di @ das sono corrette E stavo arrivando a questo nel modo sbagliato :) – Shizam

+1

Perché sulla documentazione non è possibile specificare questo comportamento per 'dispatch_semaphore_wait()' - non dice assolutamente nulla sul valore del semaforo NON viene decrementato se il timeout è scaduto e la risorsa è già stata acquisita. Comunque, ottima risposta - Posso confermare che questo è il caso, il decremento del semaforo si verifica solo quando il test contro 'DISPATCH_TIME_NOW' restituisce 0. Non è necessario' dispatch_semaphore_signal() 'nel caso diverso da zero. Grazie! –

+0

@ rob-glassey nessun argomento che la documentazione è carente su questo punto, si prega di file un [bug] (http://bugreport.apple.com)! – das

Problemi correlati