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

时间:2016-06-14 12:35:10

标签: c++ multithreading

我很感激有关如何定期唤醒C ++ 11线程的一些指示(比如说每100毫秒)。该平台是Linux和C ++语言。我遇到了这个解决方案:

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

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

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

将POSIX计时器与C ++线程结合起来是一种前进的方法吗?我不确定这究竟是如何起作用的。

任何有关如何入门的建议都将受到赞赏。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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)。我没有: - (

答案 2 :(得分:3)

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

答案 3 :(得分:1)

对于纯C ++方法,没有任何特定于实现的函数,您可以创建std::mutexstd::condition_variable,锁定互斥锁,然后使用wait_for()睡眠条件,在你的主题中持续100ms或任何其他间隔。

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

答案 4 :(得分:1)

我会在计时器上通过std::async调用该函数。但是,如果您的功能通常需要的时间超过您将快速消耗资源的时间。另外,创建新线程的成本相对较高。

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