1

在学习了一个学期的并发编程理论之后,我想把我学到的东西付诸实践,即整体监视器。我知道监视器是一个收集数据结构、函数和条件变量的对象(类的实例)。我已经看到在 C++ 中我可以用线程来完成所有这些工作。相反,如果我想在进程之间共享一个监视器(条件、数据结构......),我该怎么办?也许用 fork() 创建...例如生产者和消费者。我已经看到有一个 boost 库可以在进程间共享条件变量……对吗?

4

3 回答 3

1

有几种选择,请参阅主要搜索引擎上的进程间通信。如果您想共享对象和标志,听起来这两个进程紧密合作,在这种情况下线程是更好的选择。

于 2013-02-04T20:53:41.177 回答
1

进程间通信通常通过操作系统信号量和共享内存完成。分配和管理这些资源的框架非常依赖于操作系统。

幸运的是,Boost C++ 库已经有一个独立于操作系统的抽象可以做到这一点

于 2013-02-04T21:13:18.690 回答
1

一种方法是将问题拆分为 3 个或更多部分。

监视器上方法的抽象接口。如果对象应该是进程间的,您可以在后台实现 IPC,或者依赖每个进程具有相同的方法代码。

数据既可以存储在一个地方(每个人都使用 IPC 与那个地方通信),也可以存储在每个进程中并保持同步。请注意,数据的共享内存是 IPC 数据的一种解决方案(允许代码在每个进程中本地存在)。

第三部分是同步。这可以作为与“公共对象”完全不同的问题来处理,并且主要与您如何使其工作正交地解决。

一种方法是制作一个同步访问任意数据的模板,有点像这样:

template<typename T, typename MyMutex=std::mutex, typename MyLock=std::unique_lock>
struct Synced {
  mutable MyMutex mutex;
  T* t;
  Synced( T& t_ ):t(&t_), mutex() {}
  Synced( T& t_, MyMutex&& m ):t(&t_), mutex(std::move(m)) {}
  template<typename Functor>
  auto operator()( Functor&& f )->decltype( f(declval<T>()) ) const {
    MyLock _(mutex);
    return f(*t);
  }
};

这是一个围绕任意类型 T 的同步包装器的示例。即:

Synced<std::ostream> synced_cout(std::cout);
void test() {
  synced_cout([&](std::ostream& os) {
    os << "Hello world!\n";
  });
}

我以ostream通用方式同步访问。

(以上大部分内容都是从 Bjarne Stroustrup 或 Herb Stutter 公然窃取的,任何错误都是我自己的)。

于 2013-02-04T22:31:26.290 回答