将deadline_timer偏移10毫秒
boost deadline_timer shift 10 milliseconds
有没有人遇到过deadline_timer不断地在10毫秒后调用下一个回调函数?这是意料之中的吗?
操作系统是centos 6, boost版本是1.54
。
Aug 14 16:36:01.697
Aug 14 16:36:02.706
Aug 14 16:36:03.716
Aug 14 16:36:04.726
Aug 14 16:36:05.736
Aug 14 16:36:06.746
Aug 14 16:36:07.756
Aug 14 16:36:08.766
Aug 14 16:36:09.776
Aug 14 16:36:10.786
Aug 14 16:36:11.796
Aug 14 16:36:12.806
Aug 14 16:36:13.816
Aug 14 16:36:14.826
Aug 14 16:36:15.836
Aug 14 16:36:16.846
Aug 14 16:36:17.856
代码如下所示
// std::unique_ptr<boost::asio::deadline_timer> m_poTimer;
void timerExpired(const boost::system::error_code& oError)
{
if (!oError)
{
m_poTimer->expires_from_now(boost::posix_time::millisec(1000));
m_poTimer->async_wait(std::bind(&timerExpired, this, std::placeholders::_1));
}
else
{
}
}
与通用分时操作系统上的任何应用层计时器一样,从根本上不可能保证在精确的时间之后执行。你的操作系统不断地在进程和线程之间进行上下文切换,通常大约5-10ms的分辨率,你的代码没有办法中断CPU立即执行,没有什么东西唤醒它,并在第一时间检查计时器。
所有应用层计时器都是为"至少t"而设置的,你对此无能为力。
我承认很惊讶你有这样一个可靠和可重复的模式,但要么:
- 这是你的环境因素(我们不能说话),或者
- 这是库的一个因素(我看不到任何证据),或者
- 这是您的代码的一个因素(我们无法判断,因为您没有提供测试用例),或者
- 这只是由上述事实造成的异常,你对此无能为力。
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C / C++ 移位/偏移/向左或向右移动位图?
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- clang整洁10忽略了我的NOLINT命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- 整数溢出,最大值为 pow(10,19)
- 如果 x < 10,则添加前导 0 并将其存储为 int
- C++每 10 毫秒执行一次函数
- 以毫秒为单位的时间戳给了我 10 位C++数字
- 10毫秒的C++执行时间
- 自unix epoch以来,将日期,时间和UTC偏移值转换为毫秒
- 将deadline_timer偏移10毫秒