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