C ++:监视和条件变量进程间

时间:2013-02-04 18:29:17

标签: c++ c++11

研究并发编程理论 整个学期,我想付诸实践 我学到了什么,整体监视器。 我知道监视器是一个收集数据结构,函数和条件变量的对象(类的实例)。我在C ++中看到过,我可以 用线程做所有这些。相反,如果我想在进程之间共享监视器(条件,数据结构......),我该怎么办?也许创建了wth fork()...例如,生产者和消费者。 我已经看到有一个提升库来共享条件变量进程间......是不是?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

幸运的是,Boost C ++库已经具有独立于操作系统的抽象,可以this

答案 2 :(得分: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公然偷走的,任何错误都是我自己的。)