Boost:: ASIO: serwis io.run() vs poll() czyli jak zintegrować boost:: asio w mainloop

Próbuję po raz pierwszy użyć boost::asio do jakiejś prostej sieci tcp i już natknąłem się na coś, z czym nie jestem pewien, jak sobie poradzić. O ile rozumiem io_service.metoda run() jest w zasadzie pętlą, która działa, dopóki nie zostanie nic więcej do zrobienia, co oznacza, że będzie działać, dopóki nie zwolnię mojego małego obiektu server. Ponieważ mam już jakąś konfigurację mainloop, wolałbym ręcznie zaktualizować pętlę sieciową z tego miejsca, tylko dla dobra prostota, i myślę, że io_service.poll() zrobiłby to, co chcę, coś w tym stylu:

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}

To wydaje się działać, ale nadal zastanawiam się, czy jest jakaś wada tej metody, ponieważ nie wydaje się to być powszechnym sposobem radzenia sobie z usługami boost::asios io. Czy jest to poprawne podejście, czy raczej powinienem użyć io_service.run() w nie blokującym dodatkowym wątku?

Author: moka, 2011-01-16

2 answers

Użycie io_service::poll zamiast io_service::run jest całkowicie dopuszczalne. Różnica jest wyjaśniona w dokumentacji

Funkcja poll () może być również użyta do wysyłania gotowych opiekunów, ale bez blokowania.

Zauważ, że io_service::run zablokuje, jeśli jest jakiś work w lewo w kolejce

Klasa robocza służy do informowania io_service po rozpoczęciu pracy i wykończenia. Zapewnia to, że funkcja run() obiektu io_service Wola nie opuszczać w trakcie prac, i że wychodzi, gdy nie ma pozostały niedokończone prace.

Podczas gdy io_service::poll nie wykazuje takiego zachowania, po prostu wywołuje gotowe programy obsługi. Zauważ również, że będziesz musiał wywołać io_service::reset przy każdym kolejnym wywołaniu do io_service:run lub io_service::poll.

 39
Author: Sam Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-27 10:16:27

Wadą jest to, że zrobisz pętlę zajętości.

while(true) {
    myIoService.poll()
}

Będzie używać 100% cpu. myIoService.run() użyje 0% cpu.

myIoService.run_one() może zrobić to, co chcesz, ale zablokuje, jeśli nie ma nic do zrobienia.

 2
Author: Kurt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 02:13:23