c++ - Boost C++ 进程间

标签 c++ multithreading boost shared-memory interprocess

我是初学者,从 boost c++ 进程间库和 ipc 机制开始。托管共享内存和托管堆内存有什么区别?

在托管共享内存中,为了增加段的大小,我们需要使用 segment::grow() 方法离线增长它。

堆内存是否允许在线增加内存段的大小(当进程正在访问它时)?

我想知道不同线程访问的进程中存在的映射对象是否可以共享给其他执行不同线程的进程?

实现它的最佳技术是什么?我无法从 boost 进程间文档中得到这个。

最佳答案

您的问题有点宽泛,可以归结为“我害怕做错了”。因此,请允许我简要地解决这些问题。

Does heap memory allow to increase the size of memory segment online(when processes are accessing it)?

如果您指的是常规进程堆(由 (C) 标准库提供便利),那么,是的。我认为在过去的 20 到 30 年中,您从来不需要明确说明堆的大小(更不用说增长了)。

是的,进程堆由操作系统 1 透明地增长。

What is the difference between managed shared memory and managed heap memory?

同样,如果您所说的“托管堆”指的是常规 [标准库] 进程堆,则差异很明显。

任何跨进程共享的东西都必须清除绝对内存引用,因为映射可能 将位于其他进程中的不同基址。这意味着只有严格 POD data types自动支持。其余的一切,如容器,只有在使用避免绝对指针的专用分配器时才可以。

旁注:如果您正在考虑像 JVM 或 CLR 概念那样的“托管堆”,那就是另一回事了。这些 VM 中的引用类型通常可以透明地移动,但其机制明显不同(因为它们服务于不同的目标:避免在 generational garbage collectors 中产生碎片和分区)。

Does heap memory allow to increase the size of memory segment online(when processes are accessing it)?

根本无法从多个进程访问这种堆。

I would like to know if the map object existing in a process accessed by different threads can be shared to other process executing different threads?

为了线程安全,可以把进程等同于线程。来自其他进程的线程也是如此。您必须同步对共享数据的访问 - 无论是来自同一进程内的线程还是来自进程外的线程。

这可以通过原子数据类型(https://www.boost.org/doc/libs/1_66_0/doc/html/atomic.htmlhttps://en.cppreference.com/w/cpp/atomic)以及经典同步原语来实现。

跨进程共享这些原语通常可以通过两种方式完成:

  • 在共享内存中使用 Boost 的进程间原语
  • 以命名进程间同步原语的形式使用来自操作系统的帮助

参见 https://www.boost.org/doc/libs/1_68_0/doc/html/interprocess/synchronization_mechanisms.html了解详情。

总结

您没有问但可能在您的思考背后的问题是“Boost Interprocess 段管理器管理什么”?

在实践中,它确实提供了类似堆的共享内存管理(其中一个限制是:无法在线增长)。然后,这用于 boost Boost Interprocess allocator,您可以使用它在共享内存段内存储非 POD 数据类型(如字符串或其他容器)。

如果您查看我的回答,您会发现很多关于如何做到这一点的示例:


¹ 在过去几十年的主流操作系统上

关于c++ - Boost C++ 进程间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52629459/

相关文章:

c++ - 在 C++ 中使用 std::vector 进行逃逸分析

c++ - 指向动态分配的 boost multi_array 中的类的指针,而不是编译

java - 在java中使servlet线程安全

Java 线程,错误的计数器

c++ - Boost 线程检查当前线程是否等于另一个 native 句柄

c++ - 相同大小的小对象的非常快速的对象分配器

c++ - 如何使用directshow将文本信息添加到avi

c++ - C++ 客户端可以调用用 golang 编写的 golang GRPC 服务器 stub 吗?

c++:交换 vector 和指针失效?

c - 阅读;线程安全与否?