我很感激有关如何定期唤醒C ++ 11线程的一些指示(比如说每100毫秒)。该平台是Linux和C ++语言。我遇到了这个解决方案:
C++ 11: Calling a C++ function periodically
但是他们调用了一个回调函数,然后在计时器间隔内休眠。这意味着实际周期是函数执行时间+间隔。我想以恒定的间隔调用回调,而不管它的执行时间。
我想知道Boost会不会有帮助?但我不想使用它,因为这个项目不是多平台的,我想尽量减少第三方库的使用。
将POSIX计时器与C ++线程结合起来是一种前进的方法吗?我不确定这究竟是如何起作用的。
任何有关如何入门的建议都将受到赞赏。
答案 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::mutex
和std::condition_variable
,锁定互斥锁,然后使用wait_for()
睡眠条件,在你的主题中持续100ms或任何其他间隔。
为了更精确地控制唤醒间隔,它会考虑线程执行的实际时间,暂停之间,使用wait_until()
以及合适的时钟。
答案 4 :(得分:1)
我会在计时器上通过std::async
调用该函数。但是,如果您的功能通常需要的时间超过您将快速消耗资源的时间。另外,创建新线程的成本相对较高。
因此,您可以通过std::chrono::high_resolution_clock
计算函数的持续时间长度,然后使用wait_for
在剩余的时间内休眠。