当没有更多的工作要做时,防止Boost::ASIO::IO_CONTEXT返回

Prevent boost::asio::io_context from returning when there is no more work to do(当没有更多的工作要做时,防止Boost::ASIO::IO_CONTEXT返回)

本文介绍了当没有更多的工作要做时,防止Boost::ASIO::IO_CONTEXT返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

boost::asio::io_context::run()在没有挂起的工作时返回。我希望避免此行为,以便run()确实无限期地等待新工作,并有可能从另一个线程停止它。

我想这可以通过在io_context中启动一个无限长的计时器,并在我们希望run()返回时调用该计时器来实现。

这是正确的方法吗?有干净的方法吗?

推荐答案

可以使用executor_work_guard。 在ctor中,它从io_CONTEXT实例中获取Executor并在此Executor上调用on_work_started,这意味着io_context::run不会在没有工作要做时结束see reference。

这可确保io_Context的run()和run_one()函数 工作正在进行时不退出。

所以简单的代码看起来像

  boost::asio::io_context io;
  boost::asio::executor_work_guard<decltype(io.get_executor())> work{io.get_executor()};

  io.run(); // [1]
  cout << "you will never see this line" << endl;

代码挂起在1行。io_context::run可能在调用work析构函数时结束。

在较早的Boost或ASIO版本上,对应的类为io_service::work

这篇关于当没有更多的工作要做时,防止Boost::ASIO::IO_CONTEXT返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:当没有更多的工作要做时,防止Boost::ASIO::IO_CONTEXT返回

基础教程推荐