我有一个线程,其工作是向UDP对等体发送消息。线程发送消息iff以下适用之一:
1)自上次发送消息(如超时)以来已经过了一段时间。
2)共享结构中的更新布尔标志已由其他线程引发。
我希望能够等待这些条件发生,以便我知道何时发送消息。
我能做到的最简单的方法是制作一个循环,重复直到其中一个条件满足。我担心它正在忙着等待,并且会消耗大量的CPU时间。我也不想使用sleep()。
我不介意使用C ++解决方案,只要它易于理解和实现,因为我对C ++不是很熟悉。
谢谢!
答案 0 :(得分:10)
对于Windows,请使用事件(CreateEvent
)而不是bool,然后使用WaitForSingleObject
。
答案 1 :(得分:2)
对于线程之间的信号我同意Erik。使用事件对象。
对于超时问题,您可以使用CreateWaitableTimer()和SetWaitableTimer()。
要在线程中等待事件发出信号或计时器用完,可以使用wait函数WaitForMultipleObjects()。您可以将一个句柄数组(=句柄处理事件和句柄处理程序)传递给它,以等待它们发出信号。
等待函数具有不占用CPU的优点,就像轮询循环一样,因为等待是在内核级别处理的,并且线程在等待对象发出信号时被挂起。
答案 2 :(得分:0)
您最有可能想要使用线程中嵌入的回调例程。请参阅What is a “callback” in C and how are they implemented?以获取解释,并查看此wiki example中的C示例,该示例将回调实现为函数指针。使用某种类型的事件框架(如Erik等人的建议)更容易,而不是自己动手,但这是一个方便的技巧。
答案 3 :(得分:0)
我会使用WaitForMultipleObjects,监听2个事件 第一个是退出线程,第二个是完成工作。
像这样......
DWROD dwTimeOut = .....;
DWORD dwRetValue = WaitForMultipleObjects(2, hEvents, false, dwTimeOut);
if( (dwRetValue == WAIT_TIMEOUT) || (dwRetValue == (WAIT_OBJECT_0 + 1)))
{
// Do Work
}
else if(dwRetValue == WAIT_OBJECT_0)
{
// End Thread
}
else
{
// Deal with Error
}