不使用条件变量或睡眠功能的定期线程唤醒

时间:2018-07-23 14:44:40

标签: multithreading performance c++11

  1. 不想使用高分辨率时钟的睡眠功能,因为繁忙的睡眠会消耗CPU。

  2. 我不想使用条件变量依赖某些事件的唤醒唤醒伪造信号或信号,因为它不能保证周期性。

请建议这些行上是否有可能。我无法在线找到任何解决方案。我需要在线程中实施驱逐策略,该策略将尝试每x秒唤醒一次并清理队列(如果大于特定大小)。

1 个答案:

答案 0 :(得分:1)

您正在运行什么操作系统?因为至少在Linux / GCC5.4上,std::this_thread::sleep_for函数不会等待。例如:

$ cat test.txt
#include <chrono>
#include <thread>

int main(int argc, char** argv)
{
    printf("Start\n");
    std::this_thread::sleep_for(std::chrono::seconds(5));
    printf("Stop\n");
    return 0;
}

$ g++ -std=c++14 -o test test.cpp

$ time ./test

Start
Stop

real    0m5.003s
user    0m0.002s
sys     0m0.001s

查看程序如何花费5秒的实时时间,但几乎没有用户(cpu)时间?

关于第二点,没有用户操作系统能够保证周期性,因为它是分时操作系统,并且底层调度程序不能保证进程可运行之后的最大等待时间。为此,您需要查看real-time operating system。但是,对于大多数应用程序,使用condition_variable等待时,调度程序引入的抖动可能会很好。