文字问题:
对于我的应用程序,我有一个从串行端口读取的类。它使用 Windows 原语进行 COM 端口处理,并有一个用于异步读取的线程。我正在尝试使用 Boost.Asio 和 Boost.Thread 等 Boost 库将其从 Windows 原语转换。
在 Windows 端口中,我的 IO 线程有几个 MFC CEvent 变量,每个变量代表一条消息:Read requested、Write requested、Read completed、Write completed、IO Cancelled。这些是用 WaitForMultipleObjects 等待的。
我遇到的问题是 Boost.Thread 似乎既没有 CEvent 也没有 WaitForMultipleObjects 的类似物。我最接近的方法是丢弃这些并用一组布尔值替换事件,然后使用条件变量,只要布尔值发生变化,就会调用它的 notify_all() 函数。
然而,boost::condition_variable 与 CEvent 有一个关键的不同:如果 CEvent 在没有被等待时发出信号,那么下一次等待它会立即成功。使用 boost::condition_variable,如果没有等待,任何通知函数都会被忽略。
这意味着在检查标志和等待可能丢失通知的 condition_variable 之间总是存在间隙。这会导致线程挂起。
有人知道这个问题的解决方案吗?
代码中的问题:
// Old IO Thread
CEvent msg_cancel;
CEvent msg_read_req;
CEvent msg_write_req;
CEvent msg_read_comp;
CEvent msg_write_comp;
CEvent events[] = {
msg_cancel,
msg_read_req,
msg_write_req,
msg_read_comp,
msg_write_comp
};
bool cancel = false;
while (!cancel)
{
switch(WaitForMultipleObjects(5, events, false, INFINITE))
{
case WAIT_OBJECT_0 :
// msg_cancel
cancel = true;
break;
...
}
}
如何在 Boost.Thread 中模拟它?