gpt4 book ai didi

c++ - Boost.Thread 类 CEvent 行为

转载 作者:太空狗 更新时间:2023-10-29 21:31:02 25 4
gpt4 key购买 nike

文字问题:

对于我的应用程序,我有一个从串行端口读取的类。它使用 Windows 原语进行 COM 端口处理,并有一个线程用于异步读取。我正在尝试使用 Boost.Asio 和 Boost.Thread 等 Boost 库将其从 Windows 原语中转换出来。

在 Windows 端口中,我的 IO 线程有几个 MFC CEvent 变量,每个变量代表一条消息:请求读取、请求写入、读取完成、写入完成、IO 取消。这些是用 WaitForMultipleObjects 等待的。

我遇到的问题是 Boost.Thread 似乎没有 CEvent 和 WaitForMultipleObjects 的类似物。我最接近的做法是丢弃这些并用一组 bool 值替换事件,然后使用 condition_variable,只要 bool 值发生变化,它就会调用 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 中模拟它?

最佳答案

如您所说,要类似于 Windows 样式事件,您需要一个条件变量和一个 bool 标志。当然,如果满足您的需要,您可以将多个 bool 标志组合为一个。

但是,您提到的问题(条件变量永远不会获得 wait 将立即返回的 active 状态)通常是这样解决的:

condition-variable
mutex

main-thread:
lock(mutex) { start condition-signaling-thread }
while(some predicate) {
condition-variable.wait(mutex)
do-stuff
}

condition-signaling-thread:
loop:
lock(mutex) {
do-whatever
}
condition-variable.notify();

通过让第二个线程等待直到互斥量被处理条件的线程解锁,您可以确保处理每个条件。 (注意:在 Java 中,必须在锁内调用 notify() 方法,这取决于实现细节,如果在 C++ 中完成,可能会导致更差的性能,但确保程序员至少曾经考虑过如何同步用接收器触发条件)。

boost.thread 不提供 windows 风格的事件(和 posix-semaphores,顺便说一句)的原因是这些原语很容易搞砸。如果您不打算将您的应用程序移植到另一个平台,那么让您的应用程序适应这种不同的风格可能不值得。

关于c++ - Boost.Thread 类 CEvent 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com