Sincronizzare gli accessi alla coda di messaggi

Diversi sono gli aspetti da trattare. In primo luogo è necessario garantire l'accesso ad una coda di messaggi in mutua esclusione per le operazioni di lettura (readMessage) e scrittura (writeMessage) contemporanee (cioè se eseguite su thread diversi) alla stessa coda di messaggi.

In secondo luogo, si desidera che le operazioni di lettura di messaggi siano bloccanti. Questo significa che quando un agente effettua una operazione di lettura e non è presente alcun messaggio nella propria coda l'esecuzione si arresta per attendere che un altro agente ne recapiti uno. Il thread contenente la lettura deve quindi essere posto in wait, liberare la risorsa ed essere risvegliato quando qualcuno effettuerà una scrittura di un messaggio.

Si noti che esistono diversi tipi di letture di messaggi (readMessage), quella generica che legge il primo messaggio in coda e quella che legge dalla coda un messaggio con specifiche caratteristiche (sender e/o tipo di messaggio). Anche in questi casi la lettura è bloccante, ossia il thread contenente la lettura deve essere posto in wait finchè un messaggio con le caratteristiche richieste non viene trovato indipendentemente dal fatto che nella coda siano presenti altri messaggi.

Si modifichi la classe MessageBox in modo da soddisfare queste richieste.

Discutere come si potrebbe realizzare degli analoghi dei metodi readMessage e writeMessage non bloccanti (se il messaggio non è presente nella coda viene sollevata, ad esempio, una eccezione oppure restituito null).

baldoni 2005-01-13