2010-09-25 13 views
5

Mentre collaudo unità per un sistema client/server al lavoro, mi sono imbattuto in un problema in cui il mio io_service non veniva rilasciato dopo che avevo arrestato tutti i gestori attivi (di cui ero a conoscenza).Elenca gestori attivi in ​​boost io_service

Dopo un giorno di navigazione attraverso il codice, mi sono imbattuto nel gestore errante che non era stato integrato nelle procedure di spegnimento del mio client.

La mia domanda è questa: c'è un modo semplice per elencare i gestori attualmente attivi nel boost io_service ?, in caso contrario, perché no?

Qualsiasi intuizione sarebbe apprezzata.

+1

+1 domanda interessante. L'ho visto sulla mailing list degli utenti asio, ma non credo che abbia ricevuto risposta. http://sourceforge.net/mailarchive/forum.php?thread_name=i3aupp%2458b%241%40dough.gmane.org&forum_name=asio-users –

risposta

1

Ci sono alcuni problemi:

  • La contabilità diventerà costoso, soprattutto nei sistemi con un gran numero di operazioni e concorrenza significativa.
  • Anche se hai ricevuto una lista, non sai se è aggiornata.

Non so se questi sono i motivi specifici di boost :: asio, ma queste ragioni mi saltano addosso.

Per risolvere il problema, distruttori e ambiti sono tuoi amici. Trovo utile avere un contenitore di maniglie per oggetti di alto livello (ad esempio ascoltatori di socket) e lasciare che questi escano dall'ambito quando si desidera arrestare. Trovo che shared_ptr sia buono, ma potresti usare tutti i tipi di varianti.

Se si deve chiamare un metodo stop() su ogni oggetto che si desidera interrompere, si dimentica qualcosa. Lascia che i distruttori facciano il lavoro.

Problemi correlati