Этим
ios->post([&handler](){
handler(2);
});
вы создаете лямбду, которая ставится в очередь в io_service
.Это закрытие выполняется внутри io_service::run
.Вы захватываете ссылку handler
, которая является локальной внутри AsyncRead
.Когда handler(2)
вызывается
AsyncRead(&s,yield[er]);
сопрограмма возобновляется в вышеприведенной строке, result.get()
вызывается из AsyncRead
, AsyncRead
заканчивается, и обработчик как локальная переменная уничтожается, но замыкание, которое выполняется в io_service::run
по-прежнему ссылается на эту переменную - неопределенное поведение.
Вам нужно захватить обработчик по значению, переместив его в поток и лямбду:
std::thread thread([ios,handler = std::move(handler)]() {
std::cout << std::time(nullptr) << ":run in thread before sleep"<< std::endl;
sleep(5);
std::cout << std::time(nullptr) << ":run in thread after sleep"<< std::endl;
std::cout << std::time(nullptr) << ":run in thread before cb" << std::endl;
ios->post([handler = std::move(handler)]() mutable {
handler(2);
});
std::cout << std::time(nullptr) << ":run in thread after cb"<<std::endl;
});