所以,情况是这样的。我有一个 C++ 库,它正在做一些进程间通信,它有一个wait()
阻塞和等待传入消息的函数。困难在于我需要一个定时等待,如果在指定的时间内没有收到任何消息,它将返回一个状态值。
最优雅的解决方案可能是重写库以向其 API 添加定时等待,但为了这个问题,我假设它不可行。(实际上,它看起来很困难,所以我想知道另一个选项是什么。)
以下是我如何在繁忙的等待循环中使用伪代码执行此操作:
while(message == false && current_time - start_time < timeout)
{
if (Listener.new_message()) then message = true;
}
不过,我不想要占用处理器周期的繁忙等待。而且我也不想只是sleep()
在循环中添加一个调用来避免处理器负载,因为这意味着响应速度较慢。我想要一些通过适当的块和中断来做到这一点的东西。如果更好的解决方案涉及线程(这似乎很可能),我们已经在使用boost::thread
,所以我更喜欢使用它。
我发布这个问题是因为这似乎是一种具有明确“最佳实践”正确答案的情况,因为这是一种非常常见的模式。正确的方法是什么?
编辑补充:我在这里的很大一部分担心是,这是程序中的一个点,它既对性能至关重要,又对避免竞争条件或内存泄漏至关重要。因此,虽然“使用两个线程和一个计时器”是有用的建议,但我仍然试图弄清楚如何以安全和正确的方式实际实现它,而且我很容易看到自己在我的代码中犯了新手错误甚至不知道我做了。因此,一些实际的示例代码将不胜感激!
另外,我担心多线程解决方案:如果我使用“将阻塞调用放在第二个线程中并在该线程上执行定时等待”方法,如果阻塞调用永远不会返回,那么第二个线程会发生什么? 我知道第一个线程中的定时等待会返回,我会看到没有任何答案发生并继续处理,但是我是否“泄漏”了一个将永远处于阻塞状态的线程?有没有办法避免这种情况?(有什么方法可以避免这种情况并避免泄漏第二个线程的内存?)如果阻塞调用没有返回,我需要一个完整的解决方案来避免泄漏。