2009-12-21 4 views
9

Ich möchte eine globale io_service, die von einem globalen Thread angetrieben wird. Einfach genug, ich habe nur den Thread-Body-Aufruf io_service::run(). Dies funktioniert jedoch nicht, da run (run_one, poll, poll_one) zurückkehren, wenn keine Arbeit zu tun ist. Wenn der Thread jedoch wiederholt run() aufruft, wird eine Besetztschleife ausgeführt, wenn nichts zu tun ist.dedizierten Thread für io_service :: run()

Ich bin auf der Suche nach einer Möglichkeit, den Thread zu blockieren, während es keine Arbeit in der io_service zu tun gibt. Ich könnte dem Mix ein globales Ereignis hinzufügen, damit der Thread blockiert wird. Dies würde jedoch erfordern, dass Benutzer von io_service das Ereignis jedes Mal benachrichtigen, wenn sie den Dienst nutzen. Nicht die ideale Lösung.

Hinweis: Es gibt keine tatsächlichen Globals und ich verwende nie Ereignisse für Parallelität Ich habe das Problem nur auf meinen genauen Bedarf vereinfacht. Das eigentliche Ziel ist eine asio::deadline_timer Unterklasse, die keinen io_service als Konstruktionsparameter erfordert.

Antwort

21

Sie müssen ein Objekt io_service::work erstellen.

Siehe diesen Abschnitt der Dokumentation:

Stopping the io_service from running out of work

+0

nicht über diese ein nicht kannte. +1, und löschte meinen hack-ishy Vorschlag. –

+0

danke, ich hatte begonnen, Timer mit und unendlich Timeout nur für diesen Zweck zu machen. Ich bin ständig beeindruckt von Asio. Sie haben sehr wenige Eckfälle vermisst. –