C++:监视和条件变量进程间
C++: monitor and condition variable interprocesses
在学习了并发编程理论之后整整一个学期,我都想练习我学到的是全面监控。我知道监视器是一个收集数据结构、函数和条件变量的对象(类的实例)。我已经看到在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那里公然窃取的,任何错误都是我自己的)。
- 两个不同的进程,在同一地址上有 2 个 std::atomic 变量?
- C++ Windows:从主进程和 CallWndProc 进程访问相同的变量
- 使用互斥锁和条件变量增强跨内存的进程间共享向量
- 使用文件锁定的进程之间的条件变量
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 在调用进程的上下文中通过 win32 执行批处理,从而保留环境变量
- 将 c++ 代码中的当前用户环境变量设置为对其他进程(如 cmds)可见
- 库中由单个进程的多个实体链接的全局变量
- 多进程 c++(11),链表指针作为全局变量
- 将变量/值从PHP传递到打开的窗口进程,反之亦然
- 新手需要方向 - 在单独的进程中监视变量的内容
- 从另一个进程中查找变量的地址
- MPI如何使在根进程中初始化的变量在其他进程中可见
- 如何在Qt中以编程方式为当前进程设置环境变量
- C++静态变量和多个进程
- 我们可以从父进程读取子进程的环境变量吗
- 如何使COM主机进程避免从父进程继承环境变量
- 将环境变量传递给已启动的进程bash脚本
- 父进程和子进程中的全局变量
- C++:监视和条件变量进程间