多个async_wait从一个boost Asio deadline_timer
Multiple async_wait from a boost Asio deadline_timer
是否可以在同一个boost::asio::deadline_timer上多次调用async_wait ?
我的意思是做如下的事情:
t->expires_from_now(delay);
t->async_wait(f1);
t->async_wait(f2);
这是否确保两个函数将被调用?这是否确保这两个函数将按此顺序调用?
如果没有,任何想法如何有f1和f2相继调用时,计时器超时?(我不关心在调用f1和f2之间是否执行了另一个处理程序)。
另一个问题:如果设置两个定时器t1和t2,使t1的截止日期在t2的截止日期之前,我能确保与t1相关的处理程序将在与t2相关的处理程序之前被调用吗?(在这种情况下,对于上述代码,我只需为f2创建第二个计时器,其延迟略大于第一个计时器设置的延迟)。
谢谢
仔细阅读http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_deadline_timer/async_wait.html上的文档,它指出
我对于每次调用
async_wait()
,提供的处理程序将只调用一次。
(重点)。这意味着在您的例子中,f1和f2都将被调用一次。
对于你的第二个问题:这取决于三个条件:
- 当过期时间仅相差一小段时间,低于系统时钟(或操作系统定时服务)的分辨率时,可能会出现问题。在这种情况下的行为是由定时器实现定义的(但不应该是Boost默认实现的问题,参见注释)。
- 两个处理程序在多线程环境中可能的并发性。将两个处理程序包装到同一个线程中,以解决与并发相关的问题。
- 定时器取消的可能性。当后一个计时器在前一个计时器到期之前被取消时(通过设置另一个到期时间),它会在前一个计时器到期之前触发它的处理程序。
更新:
我刚刚意识到,在你的第一个问题中,还有第二部分是关于调用处理程序的顺序的。文件中并没有提到这一点。你可以在实现中查找它,但这可能会改变。
如果你想让两个函数按顺序执行,只需从第一个函数调用第二个函数。如果第二个处理程序只在某些情况下才"追加"到第一个处理程序,那么要么延迟对async_wait
的调用,直到您知道处理程序链的整个范围,要么只是使它们彼此独立。
第三种可能是滚动您自己的、可追加的处理程序。但是请记住,处理程序被复制到io_service::run
线程中,即进入async_wait
调用,因此可附加的处理程序将只需要一个指向真实处理程序链的指针,它将需要考虑并发性等。
得分最高的答案是你问题的第一部分。对于排序(正如其他人指出的那样),deadline_timer可能会按时间顺序对它们进行排队,但不能保证。boost::asio建议将操作包装在一个链中,以便强制排序。
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- Boost program_options将多个配置文件解析结果存储到一个parsed_options中
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 仅在 boost::hash_combine 中运行一个程序期间保证确定性
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 在boost::hana中给定一个键元组,如何从映射中获取值元组
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 生成一个使用 boost 的 .cu 文件
- boost::文件系统::create_directory抛出了一个提升::文件系统::filesystem_error
- 如何创建一个版本的 boost::range::transform,该版本具有用于捕获上下文的额外参数
- 制作一个带有 boost::asio::d eadline_timer 的计时器
- boost :: filesystem :: verver()无法访问文件,因为另一个过程正在使用该文件
- Boost::p roperty_tree:在XML解析器中使用std::vector<>在一个键中存储多个值
- BASIC_SOCKETD_ACCEPTOR接口在Boost 1.66中更改.这是一个错误
- boost last_write_time更改最后一个写入值
- 如何为这个Boost.BUILD Jamfile编写一个Bazel BUILD文件
- boost::instrusive::list 带有自动取消链接钩子:我可以使用列表中的值来确定列表是否只有一个元素