我有一个线程,最终每隔1ms从传感器获取数据,并进行一些处理时间不到1ms(比如说0.5ms)。目前我希望使用另一个线程来模拟传感器。所以我的目标是让一个线程每1ms生成一次数据并将其发送到另一个线程。让我们假设生成和发送时间可以忽略不计。
我尝试使用this_thread::sleep_for
,但效果不佳。我基本上随机睡眠时间在1毫秒到15毫秒之间。我想我可以使用chrono::high_resolution_clock
。但这需要忙碌的等待。
还有其他想法吗?
我可以平均停留1ms,前提是它不会低于处理时间。
答案 0 :(得分:1)
如果你不介意浪费处理能力,请使用忙碌等待:旋转直到毫秒过去:
auto start = std::chrono::high_resolution_clock::now();
auto now = start;
while (not_ready(start, now))
{
now = std::chrono::high_resolution_clock::now();
}
答案 1 :(得分:0)
一毫秒远低于大多数操作系统的正常调度阈值。不要期望能够让两个进程或线程与该频率可靠地交互。 例如,在Linux上,默认情况下,调度程序时间片通常为100毫秒(尽管它可能更低,但不要超过10毫秒)。
答案 2 :(得分:0)
我建议设置1毫秒重载的定时器,并使用定时器的中断向量。
在我正在进行的嵌入式系统上,我们有一个1ms的计时器滴答ISR。我们调整了硬件以使其尽可能准确(包括使用示波器进行测量)。
您可能希望将其作为优先级最高的中断或任务。
我们使用的处理器配有多个计时器。当计时器到期时,它可以执行代码作为中断。
答案 3 :(得分:0)
在Windows上,您可以通过timeBeginPeriod()
调用请求自定义计时器解析(请参阅this example)。你可能仍然想测试看看它实际上有多接近1毫秒。
另外请记住,即使是忙碌等待也不是一个万无一失的解决方案。如果CPU负载足够,则无法保证程序在任何给定的1毫秒切片内都能获得执行时间。
答案 4 :(得分:0)
您是否只想睡眠时间不到1毫秒?你试过usleep()(unistd.h)还是nanosleep()(time.h)?由于调度不精确可能会有一些抖动 - 如果这是不可接受的,你需要求助于旋转循环。