当我在协程中使用spawn启动一个新的stackfull协程时,valgrind会提示许多使用未初始化值(valgrind输出)。
然后我使用io_service.post调用处理程序,在其中启动一个新的stackfull协程,一切都很正常。
我已经搜索并阅读了一些文档,但找不到有关如何在stackfull协程中安全地创建新的stackfull协程的信息。
以下是代码:
然后我使用io_service.post调用处理程序,在其中启动一个新的stackfull协程,一切都很正常。
我已经搜索并阅读了一些文档,但找不到有关如何在stackfull协程中安全地创建新的stackfull协程的信息。
以下是代码:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/system_timer.hpp>
#include <chrono>
using namespace std;
int main()
{
auto use_post = false;
boost::asio::io_service io_service;
boost::asio::spawn(io_service,
[&io_service, &use_post](boost::asio::yield_context yield){
if(use_post){
io_service.post([&io_service]{
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield){
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(1));
timer.async_wait(yield);
cout << "Sleep 1 second" << endl;
});
});
}
else{
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield){
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(1));
timer.async_wait(yield);
cout << "Sleep 1 second" << endl;
});
}
boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(2));
timer.async_wait(yield);
cout << "Sleep 2 seconds" << endl;
});
io_service.run();
return 0;
}
将use_post
变量设置为true,post + spawn将启动新的stackfull协程。
也许是我没有仔细阅读文档,在Boost.Asio C++ Network Programming
、N4045
和boost asio文档中找不到任何有用的信息。
spawn(yield_context)
重载来创建一个新的协程(源代码)。当我以valgrind ./a.out
运行程序时,valgrind仍然报告大量的“使用未初始化的大小为8的值”。这是输出。并且在运行./a.out后,valgrind出现了“段错误”。我做错了什么吗? - cfyvalgrind
? - cfyvalgrind=on
b2命令行选项定义了BOOST_USE_VALGRIND
,从而使分配的堆栈被Valgrind注册。 - Tanner Sansbury