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

C++: monitor and condition variable interprocesses

本文关键字:变量 进程 条件 监视 C++      更新时间:2023-10-16

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

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

进程间通信通常通过操作系统信号量和共享内存进行。分配和管理这些资源的框架在很大程度上依赖于操作系统。

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

一种方法是将问题分解为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.Ie:的同步包装器的例子

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

其中我以通用方式同步了对CCD_ 1的访问。

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