2012-02-20 19 views
7

In una classe, abbiamo dovuto utilizzare i semafori per eseguire il lavoro con i thread. Il prototipo (e file di intestazione) del sem_init è la seguente:sem_init (...): A cosa serve il parametro value?

int sem_init (sem_t * sem, int pshared, valore unsigned int);

ma io non capisco cosa la variabile valore viene utilizzato per. Secondo opengroup.org:

valore è un valore iniziale per impostare il semaforo per

"Valore è un valore ..." Come ci aiuta, cosa serve per?

risposta

2

sem_init() inizializza una punta di semaforo (primo parametro), con il valore (ultimo parametro), e, infine, credo che questo è in realtà quello che stavi chiedendo, int pshared si può pensare come una bandiera. Se pshared == 1, il semaforo può essere biforcato.

MODIFICA: il semaforo ha valore int perché si utilizzerà una funzione come sem_wait (sem_t * sem) per decrementare puntata al semaforo. Se è negativo, allora blocca.

+1

Che cosa significa "con un valore"?Significa che è bloccato/sbloccato? Specifica il numero di possibili acquisizioni del semaforo? – SomethingSomething

1

Al fine di comprendere il "valore" in sem_init (sem_t * sem, int pshared, valore unsigned int)

Penso che abbiamo bisogno sincronizzarlo con il modo in cui usiamo il semaforo nei codici: quando vogliamo per attendere il semaforo, chiamiamo sem_wait (& mutex), e se vogliamo notificarci di eseguire il sem_wait di altri thread (& mutex), abbiamo bisogno di chiamare sem_post (& mutex). Ma il problema è che se non tutti gli altri thread sem_post (& mutex) chiamano in un primo momento (nella inizializzazione del sistema), quale dovrebbe essere il sem_wait (& mutex) fare? Dovrebbe passare o attendere che altri thread chiamino sem_post (& mutex)? La risposta è nel "valore" in sem_init(). Se è zero, significa che dobbiamo aspettare che alcuni altri thread richiamino sem_post() una volta, quindi potrebbe passare. Se è uno, la prima volta che si chiama sem_wait() passerà subito, ma la seconda volta sem_wait() attenderà (se nessun sem_post viene chiamato durante questi). Quindi il valore in sem_init() significa quante volte potremmo eseguire sem_wait() senza realmente aspettare senza sem_post(). E potremmo considerare il sem_wait() come: /situazione di stallo in attesa fino a quando il valore viene modificato in grande di 0 da un altro thread/

mentre (valore < = 0) {}

value-- ;

e considerare la sem_post() come:

valore ++;

0

valore semaforo rappresenta il numero di risorse comuni disponibili per essere condivise tra le filettature. Se il valore è maggiore di 0, il thread che chiama sem_wait non ha bisogno di aspettare. Decrementa il valore di 1 e procede per accedere alla risorsa comune. sem_post aggiungerà una risorsa al pool. Quindi incrementa il valore di 1. Se il valore è 0, allora aspetteremo che qualcuno abbia fatto sem_post.