我有一个问题,两个线程是这样调用的,一个接一个。
new boost::thread( &SERVER::start_receive, this);
new boost::thread( &SERVER::run_io_service, this);
第一个线程调用这个函数的地方。
void start_receive()
{
udp_socket.async_receive(....);
}
第二个线程调用,
void run_io_service()
{
io_service.run();
}
有时 io_service
线程在 start_receive()
线程之前结束,然后服务器无法接收数据包。
我考虑过在两个线程之间放置一个 sleep 函数以等待一段时间以等待 start_receive()
完成并且可行,但我想知道是否还有另一种可靠的方法来实现这一点?
最佳答案
当您调用 io_service.run()
时,线程将阻塞,调度发布的处理程序,直到:
没有
io_service::work
对象与io_service
关联,或者io_service.stop()
被调用。
如果发生其中任何一种情况,io_service
将进入停止状态,并且在调用其 reset()
方法之前将拒绝在未来分派(dispatch)任何处理程序。
每次在与 io_service 关联的 io 对象上启动异步操作时,io_service::work 对象就会嵌入异步处理程序中。
因此,在异步处理程序运行之前,上面的第 (1) 点不会发生。
因此,此代码将保证异步过程完成并且断言通过:
asio::io_service ios; // ios is not in stopped state
assert(!ios.stopped());
auto obj = some_io_object(ios);
bool completed = false;
obj.async_something(..., [&](auto const& ec) { completed = true; });
// nothing will happen yet. There is now 1 work object associated with ios
assert(!completed);
auto ran = ios.run();
assert(completed);
assert(ran == 1); // only 1 async op waiting for completion.
assert(ios.stopped()); // io_service is exhausted and no work remaining
ios.reset();
assert(!ios.stopped()); // io_service is ready to run again
关于c++ - 升压::ASIO。确保仅在调用 async_receive(...) 之后调用 io_service.run()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44934987/