Ответ 1
Подумайте о системе, в которой один io_service
управляет сокетами для сотен сетевых подключений. Чтобы иметь возможность распараллеливать рабочую нагрузку, система поддерживает пул рабочих потоков, которые вызывают io_service::run
.
Теперь большинство операций в такой системе могут выполняться параллельно. Но некоторые из них должны быть сериализованы. Например, вы, вероятно, не захотите, чтобы одновременно выполнялось несколько операций записи в одном и том же сокете. Затем вы должны использовать одну цепочку для каждого сокета для синхронизации записей: записи на разных сокетах могут происходить одновременно, в то время как записи в одни и те же сокеты будут сериализованы. Рабочие потоки не должны заботиться о синхронизации или разных сокетах, они просто захватывают все io_service::run
руками.
Можно спросить: почему мы не можем использовать mutex вместо синхронизации? Преимущество сети заключается в том, что рабочий поток не будет планироваться в первую очередь, если цепочка уже обрабатывается. С помощью мьютекса рабочий поток получит обратный вызов, а затем блокируется при попытке блокировки, не позволяя нить выполнять какую-либо полезную работу до тех пор, пока мьютекс не станет доступен.