【发布时间】:2015-06-06 14:51:27
【问题描述】:
来自 Asio 文档
run() 函数一直阻塞,直到所有工作完成并且没有更多的处理程序要分派,或者直到 io_service 已停止。
在下面的 sn-p 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
没有套接字,这个 sn-p 工作得很好。
我使用的是 Ubuntu 15.04,我尝试了 gcc-4.9.2、gcc-5.1、clang-3.6、boost-1.56 和 boost-1.58。
这是一个错误吗?如果是,是否有任何解决方法,或者我只是误解了什么?
更新
此错误仅使用以下文件重现,必须在其他翻译单元中与上述 sn-p 一起编译:
#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())
{
}
【问题讨论】:
-
您的逐字代码适用于我在 OS X (10.10.3) 上使用 clang 3.6 和 Debian 8 上使用 gcc 4.9。在记录
cancel()和close()之前,它会暂停几秒钟,但随后会按预期完成。
标签: c++ c++11 boost boost-asio