C++ 线程间通信

标签 c++ multithreading c++11 thread-safety

我有几个类,每个类在不同的线程中打开不同的程序,并使用 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/

相关文章:

c++ - 如何撤消opencv中单个点的透视变换

c++ - 如何链接到动态 boost 库?

c++ - 简单的 HTTPS 服务器和 Keep-Alive 连接

java - StoreStore 屏障如何映射到 x86 下的指令?

c# - 增加线程和进程优先级以减少处理器密集型并行应用程序的执行时间

c++ - 作为 OuterClass 对象成员的 InnerClass 对象被创建了两次

ruby-on-rails - 在 Rails 线程中访问变量

templates - 用于传递 lambda 的模板特化

c++ - 返回 const_iterator 时出错

c++ - 使用 std::chrono 计算耗时时出现“段错误”