c++多线程和事件

C++ Multithreading and Events

本文关键字:事件 多线程 c++      更新时间:2023-10-16

我有一个c++应用程序,它具有以下结构:

类AAA:有一些函数,其中一个函数打开一个线程。类BBB:有一些函数,其中一个函数打开一个线程。CCC类:调用AAA类和BBB类,两者在其函数内部都打开踏板。

在AAA线程中,在某些情况下,我知道我想退出线程并通知BBB和CCC。因为我在一个线程(Win32Thread),这是一个无效的函数,我在线程中运行,所以我不能返回一个值给CCC。

我刚接触c++(来自c#领域),不知道怎么做。(通知)注:我不能改变这个结构。我只能在类的函数中添加或做微小的更改。这是一个运行在线程和大量代码中的大进程。

任何想法?如果可能的话,请不要太脏:)

我不太明白你的问题,有点太笼统了。你没有指定你使用的是哪种多线程库。

在线程之间发送消息通常使用消息队列,使用等待句柄,锁和信号量来同步它们。

当然,你需要一个安全的多线程队列来在线程之间发送消息。

一个可能的解决方案:

如果线程A需要通过将消息放入线程B队列来向线程B发送消息,则通过等待事件唤醒处于空闲状态的线程B。线程B收到消息并在队列中发布另一条消息。

另一个可能的解决方案:

线程A需要向线程B发送消息并需要回复,阻塞线程A直到没有收到回复。线程A将消息放入线程B队列中,消息对象可以在函数堆栈中。然后,如果线程B处于空闲状态,则唤醒它,然后通过等待句柄或信号量(例如)进入等待状态。当线程B将消息从队列中取出时,将答案写入线程A发送的对象中,并将线程A从等待状态中唤醒。object字段应该被标记为volatile,因为它是由两个线程进行读/写访问的。然后线程A使用存储在message object中的值,并从堆栈中删除该对象。

用文字写起来很复杂,但实现起来很简单。

如果你在Windows操作系统中,你可以使用Windows消息队列创建不可见的消息窗口,每个线程一个。第一种情况使用PostMessage,第二种情况使用SendMessage

如果你不怕windows专用的解决方案:从BBB线程调用PeekMessage()。这将为它创建一个Windows消息队列。(主线程已经有一个)。现在,您可以使用SendMessage()AAA向其他线程发送消息。注意,您正在发送给线程,而不是类。任何对GetMessage()的调用都将看到您的消息。

我对线程的典型设计是一个线程函数,它被传递给包含它的类的一个实例(它还保存了该线程的实例变量)。这是你的情况吗?线程是否有一些类的实例传递给它?如果它们这样做了,那么就从外部跟踪它们,并设置BOOL属性来标记何时停止。在线程的主循环中,您只需检查标志,看看是否有任何业务再次循环。这是退出线程的唯一干净的方法。