2012-11-04 11 views

risposta

9

Il io_service::run() eseguirà le operazioni finché ci sono operazioni asincrone da eseguire. Se, in qualsiasi momento, non vi sono operazioni asincrone in sospeso (o i gestori invocati), verrà restituita la chiamata run().

Tuttavia, alcuni disegni preferiscono che la chiamata run() non venga terminata fino a quando non viene eseguito tutto il lavoro E allo io_service è stato esplicitamente indicato che è possibile uscire. Questo è il motivo per cui è usato io_service::work. Creando l'oggetto work (di solito lo faccio sull'heap e su shared_ptr), io_service si considera sempre in attesa di qualcosa, pertanto il metodo run() non verrà restituito. Una volta che voglio che il servizio sia in grado di uscire (di solito durante lo spegnimento), distruggerò l'oggetto di lavoro.

+0

Distruggi come utilizzando reset()? – lucastamoios

+2

Di solito, se utilizzo un shared_ptr per funzionare, allora sì, chiamo 'reset()' su shared_ptr. –

6

io_service::work è classe base di tutte le opere che possono inviati ad un'istanza di io_service, per esempio quando si lavora con una presa di corrente e iniziare una lettura asincrona, in realtà si sta aggiungendo un work al io_service. Quindi normalmente non si utilizza mai work direttamente, ma c'è un'eccezione a questa:

io_service::run tornerà non appena non c'è più lavoro da fare, in modo da considerare un'applicazione che hanno alcuni fili produttori e consumatori, i produttori di tanto in tanto producono opere e pubblicarli su thread di consumo con io_service::post, ma se tutto funziona, verrà restituito io_service::run ed eventualmente il thread dell'utente verrà interrotto, quindi è necessario un lavoro arbitrario per mantenere occupato lo io_service, in questo caso è possibile utilizzare direttamente io_service::work.