POSIX 跨进程共享内存同步 C++/C++11

POSIX Shared Memory Sync Across Processes C++/C++11

本文关键字:C++ C++11 同步 内存 进程 共享 POSIX      更新时间:2023-10-16

>问题(简而言之(:我正在使用 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 方案,其中一组操作必须全部成功,或者调用块,也允许构建复杂的机制。 读/写锁可以使用一组三个信号量进行。