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

9
我希望能得到一些关于如何周期性唤醒C++11线程的指导(例如每100毫秒唤醒一次)。平台是Linux,语言是C++。我找到了这个解决方案:C++ 11: Calling a C++ function periodically,但是它们调用回调函数然后休眠计时器间隔时间。这意味着实际的时间间隔是函数执行时间加上间隔时间。我想要在一个恒定的时间间隔内调用回调函数,而不考虑其执行时间。
我想知道Boost是否有用?但我更愿意不使用它,因为该项目不是多平台,我想最小化第三方库的使用。
也许将POSIX计时器与C++线程结合起来是一个前进的方法?我不确定这会如何运作。
如何开始的任何建议都将不胜感激。

请定期调用函数而不使用线程和C中的sleep方法。 - kTT
这可能是你想要的:https://stackoverflow.com/questions/37240834/how-can-we-make-a-loop-with-chronicle-statement-in-c/37241412#37241412 - Galik
5个回答

9

4

10
链接可能会失效,因此最好将相关部分粘贴到答案中。 - SurvivalMachine
谢谢,那个链接看起来非常有帮助。 - DavidA

3

您需要测量函数执行所需的时间,然后睡眠一段时间减去执行时间。使用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)。我的不支持 :-(


OP 表示 do_something 的持续时间应该是 100ms 的一部分。 - Jarod42
1
这就是OP想要避免的。他们想要一个恒定的间隔。 - Galik

2

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

如果需要更精确地控制唤醒时间间隔,并考虑线程在暂停之间所需的实际时间,则应使用wait_until(),以及合适的时钟。


1
我会通过计时器使用std::async调用函数。但是,如果您的函数经常超过周期所需的时间,您将迅速消耗资源。此外,创建新线程的成本相对较高。
因此,您可以通过std::chrono::high_resolution_clock计算函数的持续时间,并使用wait_for来休眠剩余的时间段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接