В чем преимущество нити в boost asio?

Изучение boost asio и выяснение класса, называемого "нить", насколько я понимаю. Если есть только один io_service, связанный с конкретной цепочкой, и вывести дескриптор по цепочке.

пример (из здесь)

boost::shared_ptr< boost::asio::io_service > io_service( 
    new boost::asio::io_service
);
boost::shared_ptr< boost::asio::io_service::work > work(
    new boost::asio::io_service::work( *io_service )
);
boost::asio::io_service::strand strand( *io_service );

boost::thread_group worker_threads;
for( int x = 0; x < 2; ++x )
{
    worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
}

boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );

strand.post( boost::bind( &PrintNum, 1 ) );
strand.post( boost::bind( &PrintNum, 2 ) );
strand.post( boost::bind( &PrintNum, 3 ) );
strand.post( boost::bind( &PrintNum, 4 ) );
strand.post( boost::bind( &PrintNum, 5 ) );

Затем строка будет выполнять сериализацию обработчика для нас. Но в чем преимущества этого? Почему бы нам просто не создать один поток (например: make x = 1 в цикле for), если мы хотим, чтобы задачи стали сериализованная?

Ответ 1

Подумайте о системе, в которой один io_service управляет сокетами для сотен сетевых подключений. Чтобы иметь возможность распараллеливать рабочую нагрузку, система поддерживает пул рабочих потоков, которые вызывают io_service::run.

Теперь большинство операций в такой системе могут выполняться параллельно. Но некоторые из них должны быть сериализованы. Например, вы, вероятно, не захотите, чтобы одновременно выполнялось несколько операций записи в одном и том же сокете. Затем вы должны использовать одну цепочку для каждого сокета для синхронизации записей: записи на разных сокетах могут происходить одновременно, в то время как записи в одни и те же сокеты будут сериализованы. Рабочие потоки не должны заботиться о синхронизации или разных сокетах, они просто захватывают все io_service::run руками.

Можно спросить: почему мы не можем использовать mutex вместо синхронизации? Преимущество сети заключается в том, что рабочий поток не будет планироваться в первую очередь, если цепочка уже обрабатывается. С помощью мьютекса рабочий поток получит обратный вызов, а затем блокируется при попытке блокировки, не позволяя нить выполнять какую-либо полезную работу до тех пор, пока мьютекс не станет доступен.