2012-04-19 10 views
5

Il pattern di progettazione di oggetti attivo, a quanto ho capito, sta vincolando un tempo di vita del thread (privato/dedicato) con un oggetto e lo fa funzionare su dati indipendenti. Da una parte della documentazione che ho letto, l'evoluzione di questo tipo di paradigma è dovuta a due motivi: in primo luogo, la gestione dei thread non elaborati sarebbe dolorosa e il secondo thread in più per la risorsa condivisa non si adatta bene con mutex e lock. mentre sono d'accordo con la prima ragione, non comprendo pienamente la seconda. Rendere un oggetto attivo rende solo l'oggetto indipendente, ma i problemi come contention per lock/mutex sono ancora lì (dato che abbiamo ancora una coda/buffer condivisa), l'oggetto ha appena delegato la responsabilità di condivisione alla coda dei messaggi. L'unico vantaggio di questo modello di progettazione, come vedo, è il caso in cui dovevo eseguire un'attività asynch lungo sull'oggetto condiviso (ora che sto solo passando un messaggio a una coda condivisa, i thread non devono più bloccarsi a lungo su mutex/blocca ma bloccheranno e si contenderanno ancora per pubblicare messaggi/attività). A parte questo caso, qualcuno potrebbe dire altri scenari in cui questo tipo di schema di progettazione avrà altri vantaggi.Per utilizzare l'oggetto attivo o no?

La seconda domanda che ho è (ho appena iniziato a scavare attorno a schemi di progettazione), qual è la differenza concettuale tra oggetto attivo, reattore e modello di progettazione proattore. Come decidi in quale modello di progettazione è più efficiente e più adatto alle tue esigenze. Sarebbe davvero bello se qualcuno fosse in grado di dimostrare alcuni esempi che mostrano come si comportano i tre modelli di progettazione e quali presentano vantaggi/svantaggi comparativi in ​​diversi scenari.

Sono un po 'confuso poiché ho usato l'oggetto attivo (che usava il buffer thread-safe condiviso) e boost :: asio (Proactor) per fare lo stesso tipo di roba asincrona, vorrei sapere se qualcuno ha più approfondimenti sull'applicabilità di diversi modelli nell'affrontare un problema.

risposta

4

Il ACE website ha alcuni ottimi documenti sui modelli di progettazione Active Object, Proactor it Reactor. Un breve riassunto delle loro intenti:

Il attivo oggetto disegno del modello disaccoppia metodo di esecuzione da invocazione di metodi per migliorare concorrenza e semplificare l'accesso sincronizzato ad un oggetto che risiede nella sua proprio thread di controllo. Conosciuto anche come: Concurrent Object, Actor.

Il Proactor modello supporta il demultiplexing e dispacciamento di molteplici gestori di eventi, che vengono attivati ​​dal completamento di eventi asincroni. Questo modello è molto utilizzato in Boost.Asio.

Il Reactor disegno del modello di gestione delle richieste di servizio che vengono consegnati in concomitanza ad una domanda da parte di uno o più clienti. Ogni servizio in un'applicazione può essere costituito da diversi metodi ed è rappresentato da un gestore di eventi separato che è responsabile per la spedizione di richieste specifiche del servizio . Conosciuto anche come: Dispatcher, Notifier.