2013-05-01 2 views
1

Я использую boost asio library. Это моя реализацияboost asio io_service object и нижележащие потоки

boost::asio::io_service ioservice; 
boost::asio::io_service::work work(ioservice); 
boost::thread_group threads; 
for (int i = 0; i < 10; i++) 
{ 
    threads.create_thread(
     boost::bind(&boost::asio::io_service::run, &ioservice)); 
} 

Тогда я прохожу этот экземпляр объекта ioservice в качестве аргумента, когда мне нужен объект IO службы (например асинхронного чтения/записи/таймер). Если мне нужно иметь дело с большим количеством операций async, я просто увеличиваю количество потоков.

Некоторые из коллег создают несколько объектов обслуживания io только с одним рабочим потоком.

Какая из них правильная реализация? Можно ли улучшить?

+2

В любом случае обратите внимание, что, как правило, не имеет смысла увеличивать количество потоков за пределы количества ядер. –

ответ

2

Оба подхода правильные, но это зависит от того, что вы пытаетесь выполнить. io_service обеспечивает отличную кросс-платформенную поточную рабочую очередь.

Если вы хотите, чтобы какая-либо работа обрабатывалась в определенном потоке (например, для сериализации определенных рабочих элементов), имеет смысл иметь один io_service, выполняемый в одном потоке.

Если вы хотите, чтобы какая-либо работа была обработана, но не заботятся о том, какой поток обрабатывается или заказывается, имеет смысл иметь один io_service, выполняемый на нескольких потоках.