我正在从使用本机Win32 API调用来管理线程的消息队列过渡到使用我自己的C ++代码。我遇到了一个无法完全回答的问题。
给出以下代码段
LRESULT QueueConsumeThread()
{
MSG msg = { 0 };
HANDLE hHandles[] = { hHandle1, hHandle2 };
while (true)
{
DWORD dwRes;
switch (dwRes = ::MsgWaitForMultipleObjects(_countof(hHandles), hHandles, FALSE, INFINITE, QS_ALLEVENTS))
{
case WAIT_OBJECT_0 :
DoSomething();
break;
case WAIT_OBJECT_0 + 1:
DoSomething2();
break;
case WAIT_OBJECT_0 + _countof(hHandles):
ATLASSERT(msg.message == WM_QUIT);
return 1;
}
}
return 1;
}
我在许多资料中都读到特定线程应该与单个condition_variable
相关联,而且使用多个condition_variable
或调用wait_for()
或wait_until()
不会听起来不太高效。
以下source建议使用safe_queue
来实现condition_variable
。我猜想PeekMessage
/ GetMessage/MsgWaitForMultipleObject
的工作方式类似,但是队列中的每个单元格应该容纳什么样的数据并能够接收事件信号?
编辑:我是问这个问题,因为我必须编写一个跨平台应用程序。
答案 0 :(得分:1)
与Windows同步事件相反(可以处于signalled
状态)std::condition_variable
与该状态解耦。因此,最自然的方法是定义多个条件并使用单个condition_variable
等待/报告它们:
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, []{ return ready1 || ready2 || ready3; });
if (ready1) { ... }
if (ready2) { ... }
if (ready3) { ... }
std::unique_lock<std::mutex> lock(m);
ready1 = true;
cv.notify_one();