不使用条件变量或睡眠函数的周期性线程唤醒



I

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

  2. 我不想依赖于一些唤醒呼叫杂散或基于某个事件的信号使用条件变量,因为它不能保证周期性。

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

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

$ cat test.txt
#include <chrono>
#include <thread>
int main(int argc, char** argv)
{
printf("Startn");
std::this_thread::sleep_for(std::chrono::seconds(5));
printf("Stopn");
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(时间的?

至于第二点,没有一个消费者操作系统能够保证周期性,因为它是一个分时操作系统,底层调度程序不能保证进程可运行后的最长等待时间。为此,您需要查看实时操作系统。然而,对于大多数应用程序,在使用condition_variable等待时,您可能会对调度器引入的抖动感到满意。

最新更新