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
.
- 1. Perché dobbiamo usare boost :: asio :: io_service :: work?
- 2. Perché dovrei usare gitignore?
- 3. Perché dovrei usare glBindAttribLocation?
- 4. Perché dovrei usare Drools?
- 5. Perché dovrei usare funzioni divergenti?
- 6. Perché non dovrei usare atoi()?
- 7. Perché dovrei usare Spring Android?
- 8. Perché non dovrei usare Unity?
- 9. Perché dovrei usare exit select?
- 10. Perché dovrei imparare e usare i montanti?
- 11. Perché dovrei usare Doctrine su Zend_Db?
- 12. Perché dovrei usare WCF con MVC?
- 13. Perché dovrei usare il posizionamento nuovo?
- 14. Perché dovrei usare il frammento in Android?
- 15. Perché dovrei usare Microsoft Expression Blend?
- 16. Perché non dovrei usare uguali con ereditarietà?
- 17. Perché non dovrei usare System.out.println() in android
- 18. Perché dovrei usare Powershell su C#?
- 19. Perché dovrei usare 'apply' in Clojure?
- 20. Perché dovrei usare i modelli di visualizzazione?
- 21. Perché dovrei usare vagabondo se uso virtualenv?
- 22. Perché dovrei usare @ Url.Content ("~/blah-blah-blah")?
- 23. Perché dovrei usare Ruby on Rails?
- 24. Personalizzazione bootstrap: Perché dovrei usare MENO?
- 25. Perché dovrei usare url.openStream invece di url.getContent?
- 26. Perché dovrei usare un operatore implicito/esplicito?
- 27. Quando/Perché dovrei usare Multithread in Java?
- 28. Perché dovrei usare immutablejs su object.freeze?
- 29. Perché dovrei usare Runnable anziché Thread?
- 30. Perché dovrei usare variabili locali implicitamente tipizzate?
Distruggi come utilizzando reset()? – lucastamoios
Di solito, se utilizzo un shared_ptr per funzionare, allora sì, chiamo 'reset()' su shared_ptr. –