我正在使用協程來玩asio,並想測試如何調用異步函數。我有以下代碼:想知道爲什麼我不能只捕獲協程的asio :: handler_type的引用
void async_foo(boost::asio::io_service& io_service, boost::asio::yield_context& yield)
{
using handler_type = boost::asio::handler_type<decltype(yield), void()>::type;
handler_type handler(std::forward<handler_type>(yield));
boost::asio::async_result<decltype(handler)> result(handler);
auto timer(std::make_shared<boost::asio::deadline_timer>(io_service, boost::posix_time::seconds(1)));
// the program crashes if I use &handler here
timer->async_wait([&handler](const boost::system::error_code) {
std::cout << "enter" << std::endl;
handler();
std::cout << "done" << std::endl;
});
result.get();
std::cout << "function finished" << std::endl;
return;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield) {
std::cout << "hello" << std::endl;
async_foo(io_service, yield);
std::cout << "world" << std::endl;
});
io_service.run();
return 0;
}
這很奇怪,如果我把&處理程序捕獲列表中的執行流將被搞砸了,然後它擊中分段錯誤。但是,如果我使用「處理程序」而不是任何問題運行(然後我需要在lambda當然副本)。
搜索過,找不到任何相關的內容。預先感謝您的幫助。
謝謝你很多關於詳細的說明。我在ctor和dtor中放置了一個輸出的測試對象,顯然在定時器觸發之前有一個堆棧展開。 –