Sono nuovo nella programmazione boost e ho cercato un motivo per utilizzare lo io_service::work
, ma non riesco a capirlo; in alcuni dei miei test l'ho rimosso e funziona bene.Perché dovrei usare io_service :: work?
risposta
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.
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
.
Distruggi come utilizzando reset()? – lucastamoios
Di solito, se utilizzo un shared_ptr per funzionare, allora sì, chiamo 'reset()' su shared_ptr. –