c++ - 升压::ASIO。确保仅在调用 async_receive(...) 之后调用 io_service.run()?

标签 c++ multithreading boost-asio

我有一个问题,两个线程是这样调用的,一个接一个。

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() 时,线程将阻塞,调度发布的处理程序,直到:

  1. 没有io_service::work对象与io_service关联,或者

  2. 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/

相关文章:

c++ - strand.post 和 strand.wrap 的性能区别是什么?

c++ - 使用 Boost Beast 通过代理发出同步 http 请求时出现问题

ios - 在 iOS 上提升 Asio SSL 认证

c++ - 为什么 C++ 输出比 C 慢太多?

python - ThreadPoolExecutor().map 与 ThreadPoolExecutor().submit 有何不同?

multithreading - 如何将父异步与多个子异步链接

c# - 使用 Thread.Sleep 时启动 .NET Windows 服务时出现问题

C++继承问题

c++ - 在 llvm 上编写一个简单的清理着陆板

c++ - fwrite.cpp 中的调试断言失败