如何定期唤醒 C++ 11 线程
How to wake a C++ 11 thread periodically?
我将不胜感激,提供一些有关如何定期唤醒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
在剩余的时间段内休眠。
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 为什么我不能在 while 循环中创建线程?