好像是linux下的bug。您需要使用一种使用CLOCK_MONOTONIC
( boost::this_thread::sleep
uses CLOCK_REALTIME
) 的睡眠方法。boost::this_thread::sleep_for
使用 boost chrono 库应该这样做,因为它使用单调时钟。
while (true) {
// Call your function here.
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
}
或者,您可以使用boost::this_thread::sleep_until
. 使用该功能,您可以使用自定义时钟。
但底层证券CLOCK_MONOTONIC
可能会受到影响adjtime()
。因此,您可以将CLOCK_MONOTONIC_RAW
其用作 linux 唯一的替代方案。
另一种可能性:如果您能够使用 C++11,您可以使用它std::chrono::steady_clock
来获得严格的单调时钟。
auto start = std::chrono::steady_clock::now();
while (true) {
std::cout << (start - std::chrono::steady_clock::now()).count() << std::endl;
}
如果系统时钟得到调整,这里的输出不会改变。但不要将此与boost::this_thread
. 使用它std::this_thread::sleep_for
可以获得正确的结果。
最后一种可能性就是使用usleep
or nanosleep
。
但请注意,您将无法使用最后两个选项(STL 和操作系统特定调用)中断睡眠。