Progettazione di app. multi-threading: pattern per il modello a sincronizzazione

Il modello a sicronizzazione è più semplice da disegnare, è sufficente individuare la terna  produttore, consumatore e risorsa e renderla evidente nel disegno.

 

  La terna Produttore, consumatore e buffer 

Il produtore e il consumatore possono ad esempio venire marcati con una interfaccia (es. IProducer e IConsumer) lo stesso vale per la risorsa che concettualmente si presta bene a essere considerata un buffer (es IBuffer).

Il buffer segue comunemente il pattern del buffer circolare: http://c2.com/cgi/wiki?CircularBuffer mentre la sincronizzazione tra produttore e consumatore può avvenire secondo il disegno per pattern Observer o detto anche Publisher-Subscribers : http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/PatternObserver.html

Anche quando il buffer non c'è perché l'elemento di sincronizzazione è un evento, chiarisce molto avere comunque una classe che rappresenta questo evento al posto di quella che rappresenta il buffer.

  Deadlock 

Quando ci sono più terne produttore/consumatore/risorsa è utile evidenziare le istanza che hanno il ruolo di consumatore per un buffer e allo stesso tempo di produttore per un altro, tracciare il grafo e  verificare se si creano dei circuiti chiusi perché sono indice di potenziali dead-lock.

 

  Produttore e/o consumatore multipli 

E' comune che per uno stesso buffer ci siano 2 o più consumatori e può accadere che ci siano  2 e più produttori. Anche questo va evidenziato nel disegno con interfacce e naming di classe.

 

  Send e Receive bloccanti o no 

Infine nei metodi di send e recive è utile usare una naming che evivenzi quando il metodo è bloccante (es. il send resta in attesa che l'altro faccia il receive) e quando no.

 

Tags :   |  

Print | posted @ martedì 27 maggio 2008 02:39

Comments have been closed on this topic.