【发布时间】:2012-03-23 03:33:36
【问题描述】:
我想为 2 个线程实现一个消息队列。线程#1 将弹出队列中的消息并处理它。线程 #2 将消息推送到队列中。
这是我的代码:
Thread #1 //Pop message and process
{
while(true)
{
Lock(mutex);
message = messageQueue.Pop();
Unlock(mutex);
if (message == NULL) //the queue is empty
{
//assume that the interruption occurs here (*)
WaitForSingleObject(hWakeUpEvent, INFINITE);
continue;
}
else
{
//process message
}
}
}
Thread #2 //push new message in queue and wake up thread #1
{
Lock(mutex);
messageQueue.Push(newMessage)
Unlock(mutex);
SetEvent(hWakeUpEvent);
}
问题是有些情况下SetEvent(hWakeUpEvent)会在WaitForSingleObject()之前被调用(注(*)),这会很危险。
【问题讨论】:
-
搜索并发有界队列。它只是你的问题。
-
“会很危险”是什么意思?
-
我认为你描述的不是问题,因为如果首先调用 SetEvent,WaitForSingleObject 根本不会休眠,而是立即返回,这样你的循环就会继续下一次迭代。请参阅 msdn“手动重置事件对象的状态保持信号状态,直到它被 ResetEvent 函数显式设置为非信号状态。任意数量的等待线程,或随后通过调用其中之一开始对指定事件对象的等待操作的线程等待函数,可以在对象状态发出信号时释放。"
-
@Nawaz:谢谢,我稍后试试^.^
-
手动或自动无关紧要,@David。只要您不使用
PulseEvent,该事件就会一直发出信号,直到有人等待为止。鉴于此处的代码,该事件需要是一个自动重置事件,因为没有任何东西会调用ResetEvent。
标签: c++ multithreading winapi