c++多线程和事件
C++ Multithreading and Events
我有一个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属性来标记何时停止。在线程的主循环中,您只需检查标志,看看是否有任何业务再次循环。这是退出线程的唯一干净的方法。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- C++11 - 可以等待多个不同事件的线程?
- 限制空闲事件的回调率,而无需阻止线程而无需多线程
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- C++事件管理器多线程可靠
- FLTK 事件映射/多线程
- 多线程事件系统
- C++中的多线程事件处理
- 在多线程程序中通过用户事件传递短数据的正确方法是什么
- 在Qt中使用多线程时的事件循环和信号槽处理
- c++多线程和事件
- 多线程和使用事件