Boost::asio::io_service::run在没有工作时不返回
boost::asio::io_service::run does not return while having no work
来自Asio文档
run()函数阻塞,直到所有的工作完成,没有更多的处理程序被调度,或者直到io_service被停止。
在下面的代码片段中,Asio除了调试输出(立即计算)之外没有任何工作,但是run()没有返回。
#define BOOST_ASIO_ENABLE_HANDLER_TRACKING
#include <iostream>
#include <thread>
#include <boost/asio.hpp>
int main()
{
namespace asio = boost::asio;
asio::io_service ios;
asio::ip::udp::endpoint ep(boost::asio::ip::udp::v4(), 9876);
auto socket = new asio::ip::udp::socket(ios, ep);
std::thread th([&]
{
ios.dispatch([]{ std::cout << "before run()" << std::endl;});
ios.run();
std::cout << "after run()" << std::endl;
});
std::this_thread::sleep_for(std::chrono::seconds(5)); // wait for io_service to launch
socket->cancel();
socket->close();
delete socket; // just in case
std::cout << "socket is closed" << std::endl;
th.join(); // hangs here
std::cout << "exiting..." << std::endl;
}
挂起前的输出为
@asio|1433598048.101578|0*1|io_service@0x611000009f00.dispatch
@asio|1433598048.101785|>0|
before run()
socket is closed
如果没有套接字,这段代码可以正常工作。
我使用的是Ubuntu 15.04,我尝试了gcc-4.9.2, gcc-5.1, clang-3.6, boost-1.56和boost-1.58。
这是一个bug,如果是,有什么解决办法,或者我只是误解了什么?
这个错误只会在以下文件中重现,必须在其他翻译单元中与上面的代码片段一起编译:
#include <boost/asio.hpp>
namespace asio = boost::asio;
class my_server
{
public:
my_server(asio::io_service& ios);
private:
asio::io_service& _ios;
asio::ip::udp::socket _socket;
};
my_server::my_server(boost::asio::io_service &ios)
: _ios(ios), _socket(ios, asio::ip::udp::endpoint())
{
}
我在https://github.com/shadeware/asio-problem创建了最小项目
显然,如果您选择定义BOOST_ASIO_ENABLE_HANDLER_TRACKING
,则必须在所有boost::asio
翻译单元中这样做。我在文档中没有看到这一点,但我在Boost邮件列表中找到了它。
添加
add_definitions(-DBOOST_ASIO_ENABLE_HANDLER_TRACKING)
到你的CMakeLists.txt
,所以它是全局应用的,然后我没有看到挂起
相关文章:
- 将返回值存储在函数指针数组的指针中是如何工作的?
- c++ 11 带有 decltype 的尾随返回类型无法按预期工作
- 虚函数如何工作,分配后新的返回类型会发生什么?
- C++:返回本地对象,但不能正常工作
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 我正在尝试从 GMocked 类返回一个 rapidjson::值,但我似乎无法让它工作
- 找不到使保证返回值优化工作的方法
- 按值返回的函数无法按预期工作
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- 参数传递和返回值如何在程序集级别的 x86 上的 C/C++ 中工作?
- 返回对局部变量的引用是否正常工作?
- Waitforsingleobject在尝试打开Notepad++时工作,但立即返回Firefox
- 返回对象如何与分配运算符一起工作
- 返回指针的语句 - 解释它是如何工作的以及为什么
- 更改C 的返回指针后可以删除工作
- 模板返回类型函数如何在C++中工作
- CPU寄存器中返回的用户定义类型的C 对象.实例方法如何工作
- 从程序不工作C++返回浮点值
- mmap无法按预期工作(返回随机0xdeadbeef)
- cpp字符串find()无法按预期工作-返回大垃圾值