Запутался в boost :: asio :: io_context :: run () и boost :: thread :: join () - PullRequest
0 голосов
/ 31 мая 2019

Как указано в документе наддува здесь , функциональные блоки 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; кодом? Я ожидаю, что выходные данные "между выполнением и соединением" будут перед всеми выходными данными второго потока.

Я думаю, что-то потерялся.

1 Ответ

1 голос
/ 31 мая 2019
Строка

с «Конечным счетом» выполняется в деструкторе класса принтера, который выполняется, когда main достигает return ();

Выполнение завершается, когда истекают все таймеры (больше нет работы, чтобы ждать / делать)
После запуска возвращается / разблокируется "cout << между выполнением и соединением". </p>

...