Как указано в документе наддува здесь , функциональные блоки boost :: asio :: io_context :: run () пока не завершится вся работа и не будет больше обработчиков для отправки или пока io_context не получит был остановлен
Теперь я сбит с толку, почему мой код, находящийся до отправки еще одного обработчика (t.join ()), не был выполнен, пока все обработчики не завершили свою работу.
Я попробовал учебник по Asio Boost Timer.5 - Синхронизация обработчиков в многопоточных программах
И я добавил одну строку кода после io.run ():
int main()
{
boost::asio::io_context io;
printer p(io);
boost::thread t(boost::bind(&boost::asio::io_context::run, &io));
io.run();
std::cout << "between run and join" << std::endl;
t.join();
return 0;
}
Вот консольные выходы:
Timer 2: 0
Timer 1: 1
Timer 2: 2
Timer 1: 3
Timer 1: 4
Timer 2: 5
Timer 2: 6
Timer 1: 7
Timer 2: 8
Timer 1: 9
between run and join
Final count is 10
Интересно, почему t.join () был выполнен перед моим std::cout << "between run and join" << std::endl;
кодом? Я ожидаю, что выходные данные "между выполнением и соединением" будут перед всеми выходными данными второго потока.
Я думаю, что-то потерялся.