POSIX 跨进程共享内存同步 C++/C++11
POSIX Shared Memory Sync Across Processes C++/C++11
>问题(简而言之(:我正在使用 POSIX 共享内存,目前只使用 POSIX 信号量,我需要控制多个读取器、多个写入器。我需要有关可以使用哪些变量/方法在下述限制内控制访问的帮助。我找到了一种想要实现的方法,但我不确定在使用 POSIX 共享内存时可以使用什么方法来实现它。
我发现了什么https://stackoverflow.com/a/28140784此链接具有我想使用的算法,但我不确定如何使用共享内存实现它。我是否以某种方式将类存储在共享内存中?这是我需要帮助的地方。我不确定的原因是我的很多研究,指出将共享内存保留给原语只是为了避免解决问题,并且无法使用 STL 对象。
注意:对于我所有的多线程,我正在使用C++11功能。此共享内存将是使用 C++11 std::threads 的完全独立的程序可执行文件,任何进程/可执行文件的任何线程都希望从中访问。我已经避免使用Linux pthread进行任何多线程处理,并将继续这样做(除非它只是控制变量而不是实际的pThreads(。
解决方案参数旨在
- 必须在 2+ 个进程之间共享,这些进程将运行多个 C++11 std::线程,可能需要访问。 即多个写入器(一次独占一个(,同时在没有写入器想要访问时允许多个同时读取器。
- 不使用 BOOST 库。理想情况下是本机 C++11 或内置的 linux 库,无需安装抽象库即可工作。
- 不使用pThread实际线程,但可以使用那里的一些对象,该对象将与C++11 std::thread一起使用。
- 理想情况下,可以在运行时处理进程崩溃。 例如,使用 POSIX 信号灯 如果一个进程在有信号量时崩溃,每个人都会被搞砸。我见过有人使用文件锁吗?
提前致谢
仅将共享内存保留为基元以避免解决问题
您可以跨程序使用指向共享内存对象的指针,只要内存mmap
到同一地址即可。 这实际上是一个直截了当的命题,尤其是在 64 位上。 有关实现细节,请参阅我编写的这个开源 C 库:rszshm - 可调整大小的指针安全共享内存。
使用 POSIX 信号灯 如果进程在具有信号量时崩溃,则每个人都会搞砸。
如果要使用操作系统介导的信号量,则 SysV 信号量具有SEM_UNDO,在这种情况下会恢复。 OTOH pthread提供了强大的互斥锁,可以在共享内存中嵌入和共享。 这可用于构建更复杂的机制。
在信号量集中提供多个信号量的 SysV 方案,其中一组操作必须全部成功,或者调用块,也允许构建复杂的机制。 读/写锁可以使用一组三个信号量进行。
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- C++11 迭代向量的新方法?