线程之间的C++通信
C++ communication between threads
我有几个类,每个类在不同的线程中打开不同的程序,并使用CreateProcess
处理/保存有关它的信息(如果有更面向C++的方法可以做到这一点,请告诉我——我看了)。
某些类依赖于运行的其他程序之一。如果A停下来,B就必须停下来。我不久前编写了这段代码,当时我的解决方案是创建一个具有静态函数的类,该类运行各种程序和保持其"状态"的静态成员变量。我也在使用CreateThread
。
回过头来看,这种方法似乎。。。看上去脆弱而笨拙。我不知道使用这样一个"静态类"是否是一种好的做法(尤其是回忆起初始化状态成员变量时有多尴尬)。我想让每个类都包含自己的run函数。然而,我正在考虑的问题是如何让B班知道A是否尴尬地停了下来。他们仍然需要知道如何了解彼此的状态。请注意,我想在这个返工中使用std::thread
,并且我对多线程几乎没有经验。谢谢你的帮助。
在多进程应用程序中,您将使用管道/文件将信息从一个进程传输到另一个进程(甚至可能是子进程的返回值)。因此,也可以尝试共享内存,尽管这可能有点挑战性(如果你愿意,可以查看Boost.Interprocess)。
在多线程应用程序中,基本上可以使用相同的选项:
- 您可以使用共享的内存(前提是同步访问)
- 可以使用队列将信息从一个线程传递到另一个线程(例如使用管道)
所以实际上这两者非常相似。
根据Tony Hoare的建议,您通常应该通过通信进行共享,而不是通过共享进行通信,这意味着将队列/管道授予共享内存的特权;然而,对于一个布尔标志,共享内存可以更容易地放置:
void do_a(std::atomic_bool& done) {
// do things
done = true;
}
int main() {
std::atomic_bool done = false;
auto a = std::async(do_a, done);
auto b = std::async([](std::atomic_bool& done) {
while (not done) {
std::cout << "still not done" << std::endl;
sleep(1);
}
});
// other stuff in parallel.
}
当然,您甚至可以将这个标志放在std::shared_ptr
中,以避免悬挂引用的风险。
相关文章:
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 混淆了如何使用IDL与Ethovision进行通信
- C++ Boost::asio串行通信与Arduino无法写入
- 我是否需要包含隐式使用/与 WindowsAPI 通信"Windows.h"?
- 通过TCP的PvP通信问题
- C++一个线程如何正确通信其任务已完成?
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 删除功能不适用于串行通信后多个循环中的多个实例
- 网站和C++程序在同一台 Linux PC 上的通信
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 使用 pybind11 共享 MPI 通信器
- 进程间通信堆内存
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- C++ 两台不同机器之间通过wifi进行套接字通信
- 提升::Asio 异步聊天客户端停止与服务器通信
- 与SPI NAND闪存(STM32L4,QSPI)的通信问题
- 线程之间的通信不起作用 - C++
- 如何在此功能中没有通信过程?
- MPI 集合通信中的指针分配