7.5.4 Oggetti Semaforo

Questa � una delle pi� vecchie primitive di sincronizzazione nella storia dell'informatica, inventata dallo scienziato olandese Edsger W. Dijkstra (egli usava P() e V() invece di acquire() e release()).

Un semaforo manipola un contatore interno che viene decrementato da ogni chiamata ad acquire() ed incrementato da ogni chiamata a release(). Il contatore non pu� mai andare sotto lo zero; quando acquire() lo trova a zero, si blocca, aspettando che qualche altro thread chiami release().

class Semaphore( [value])
L'argomento facoltativo indica il valore iniziale del contatore interno; il valore predefinito � 1.

acquire( [blocking])
Acquisisce un semaforo.

Quando invocato senza argomenti: se il contatore interno � pi� grande di zero all'entrata, lo decrementa di uno e termina immediatamente. Se � zero all'entrata, si blocca, aspettando sino a che qualche altro thread abbia chiamato release() per renderlo pi� grande di zero. Ci� viene fatto con un interlocking appropriato cos� che se pi� chiamate ad acquire() sono bloccate, release() ne risveglier� esattamente una. L'implementazione ne pu� prendere uno a caso, perci� non si pu� fare affidamento sull'ordine nel quale i thread bloccati vengono risvegliati. Non viene restituito alcun valore in questo caso.

Quando viene invocato con blocking impostato a vero, fa le stesse cose di quando viene chiamato senza argomenti, e restituisce vero.

Quando viene invocato con blocking impostato a falso, non si blocca. Se una chiamata senza un argomento si bloccherebbe, restituisce falso immediatamente; altrimenti, fa la stessa cosa di quando viene chiamato senza argomenti, e restituisce vero.

release( )
Rilascia un semaforo, incrementando il contatore interno di uno. Quando era zero all'entrata e un altro thread sta aspettando che diventi pi� grande di zero di nuovo, risveglia quel thread.



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.