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

How to wake a C++ 11 thread periodically?

本文关键字:线程 C++ 唤醒 何定期      更新时间:2023-10-16

我将不胜感激,提供一些有关如何定期唤醒C++ 11 线程(例如每 100 毫秒一次)的指示。该平台是Linux,语言C++。我遇到了这个解决方案:

C++ 11:定期调用C++函数

但是在那里,它们调用一个回调函数,然后在计时器间隔内休眠。这意味着实际周期是函数执行时间 + 间隔。我想以恒定的间隔调用回调,而不管它的执行时间如何。

我想知道 Boost 是否会有所帮助?但我宁愿不使用它,因为这个项目不是多平台的,我想尽量减少第三方库的使用。

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

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

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

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

您需要测量函数执行和休眠的时间减去执行时间。使用 std::this_thread::sleep_for 在经过的时间内进入睡眠状态。例如:

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)。我的没有:-(

对于纯C++方法,没有任何特定于实现的函数,您可以创建一个std::mutex和一个std::condition_variable,锁定互斥锁,然后使用 wait_for() 在线程中的条件上休眠 100 毫秒或任何其他间隔。

为了更精确地控制唤醒间隔,这会考虑线程执行所需的实际时间,在暂停之间,请使用 wait_until() ,以及合适的时钟。

我会通过计时器上的std::async调用该函数。 但是,如果您的函数经常花费的时间超过该时间段,您将迅速消耗资源。 创建新线程的成本也相对昂贵。

因此,您可以通过std::chrono::high_resolution_clock来计时函数的持续时间长度,然后使用wait_for在剩余的时间段内休眠。