繁体   English   中英

线程之间的C ++通信

[英]C++ communication between threads

我有几个类,每个类在不同的线程中打开一个不同的程序,并使用CreateProcess执行/保存有关它的信息(如果有更多面向C ++的方式来做这个让我知道 - 我看了)。

某些类依赖于正在运行的其他程序之一。 如果A停止,B必须停止。 我之前制作了这段代码,然后我的解决方案就是拥有一个带有静态函数的类,它运行各种程序和保持其“状态”的静态成员变量。 我也在使用CreateThread

回想起来,这种方法看起来很脆弱,看起来很尴尬。 我不知道使用这样的“静态类”是否是好的做法(特别是回想一下初始化状态成员变量有多尴尬)。 我想让每个类都包含自己的run函数。 但是,我正在考虑的问题是,如果A尴尬地停止了,那么如何让B级知道。 他们仍然需要知道一种了解彼此状态的方法。 请注意,我想在这个返工中使用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以避免悬空引用的风险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM