好像是linux下的bug。您需要使用一种使用CLOCK_MONOTONIC( boost::this_thread::sleepuses 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可以获得正确的结果。
最后一种可能性就是使用usleepor nanosleep。
但请注意,您将无法使用最后两个选项(STL 和操作系统特定调用)中断睡眠。