首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定期唤醒C++ 11线程?

如何定期唤醒C++ 11线程?
EN

Stack Overflow用户
提问于 2016-06-14 20:35:10
回答 5查看 14.2K关注 0票数 9

如果能有一些关于如何周期性(比如每100ms)唤醒C++ 11线程的建议,我将不胜感激。平台是Linux,语言是C++。我遇到了这个解决方案:

C++ 11: Calling a C++ function periodically

但在那里,它们调用回调函数,然后在定时器间隔内休眠。这意味着实际周期是函数执行时间+时间间隔。我希望以固定的时间间隔调用回调,而不考虑其执行时间。

我想知道Boost是否会有帮助?但我不喜欢使用它,因为这个项目不是多平台的,我想最大限度地减少第三方库的使用。

也许将POSIX计时器与C++线程相结合是一种前进的方式?我不确定这是如何工作的。

任何关于如何开始的建议都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-06-14 22:55:01

这里有一篇关于这个主题的好文章:使用标准C++11工具https://bulldozer00.com/2013/12/27/periodic-processing-with-standard-c11-facilities/进行定期处理

票数 4
EN

Stack Overflow用户

发布于 2016-06-14 20:53:31

使用std::this_thread::sleep_until(),每次将绝对唤醒时间递增固定间隔。

票数 9
EN

Stack Overflow用户

发布于 2016-06-14 21:26:38

您需要测量函数执行所用的时间,然后休眠一段减去执行时间的时间。使用std::this休眠该时间段。例如:

代码语言:javascript
复制
const auto timeWindow = std::chrono::milliseconds(100);

while(true)
{
    auto start = std::chrono::steady_clock::now();
    do_something();
    auto end = std::chrono::steady_clock::now();
    auto elapsed = end - start;

    auto timeToWait = timeWindow - elapsed;
    if(timeToWait > std::chrono::milliseconds::zero())
    {
        std::this_thread::sleep_for(timeToWait);
    }
}

注意:如果你的编译器支持它,你可以使用100ms而不是std::chrono::milliseconds(100)。我的不是:-(

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37812182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档