我有几个类,每个类在不同的线程中打开不同的程序,并使用 CreateProcess
执行/保存有关它的信息(如果有更多面向 C++ 的方法来执行此操作,请告诉我——我看了)。
一些类依赖于其他正在运行的程序之一。即,如果 A 停止,B 必须停止。我刚才写了这段代码,然后我的解决方案是有一个带有静态函数的类,它运行各种程序和静态成员变量来保存它们的“状态”。我还使用了 CreateThread
。
回过头来看,这种方法似乎……脆弱且笨拙。
我不知道使用这样的“静态类”是否是好的做法(尤其是记忆一下初始化状态成员变量是多么尴尬)。我可能想让每个类都包含自己的运行函数。但是,我正在考虑的问题是,如果 A 笨拙地停下来,如何让 B 类知道。他们仍然需要知道一种了解彼此状态的方法。请注意,我想在此返工中使用 std::thread
并且我对多线程处理几乎没有经验。感谢您的帮助。
最佳答案
好吧,在多进程应用程序中,您将使用管道/文件将信息从一个进程传输到另一个进程(甚至可能是子进程的返回值)。所以也可以尝试共享内存,尽管它可能有些挑战(如果您愿意,请查看 Boost.Interprocess)。
在多线程应用程序中,您基本上可以使用相同的选项:
- 您可以使用共享内存(前提是您同步访问)
- 您可以使用队列将信息从一个线程传递到另一个线程(例如使用管道)
所以两者真的很相似。
遵循 Tony Hoare 的原则,您通常应该通过通信来共享,而不是通过共享来通信,这意味着将队列/管道授予共享内存的特权;然而,对于一个 bool 标志,共享内存可以证明更容易放置:
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
中以避免悬空引用的风险。
关于C++ 线程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595760/