gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:31:48 24 4
gpt4 key购买 nike

问题(简​​而言之):我正在使用 POSIX 共享内存,目前只使用 POSIX 信号量,我需要控制多个读者、多个作者。我需要帮助了解可以使用哪些变量/方法来控制在下述限制范围内的访问。我找到了一种我想要实现的方法,但我不确定在使用 POSIX 共享内存时我可以使用什么方法来实现它。

我发现了什么 https://stackoverflow.com/a/28140784此链接具有我想使用的算法,但我不确定如何使用共享内存实现它。我是否以某种方式将类存储在共享内存中?这是我需要帮助的地方。我不确定的原因是我的很多研究都指向将共享内存保留为原语,只是为了避免解决问题,并且 STL 对象无法使用。

注意:对于我所有的多线程,我都使用 C++11 特性。该共享内存将是使用 C++11 std::threads 的完全独立的程序可执行文件,任何进程/可执行文件的任何线程都希望从中访问。我已经避免将 Linux pthread 用于我的任何多线程,并将继续这样做(除非它只是控制变量而不是实际的 pThreads)。

解决方案参数针对

  • 必须可在 2 个以上的进程之间共享,这些进程将运行多个可能希望访问的 C++11 std::thread。 IE。多个写入者(一次独占一个),同时在没有写入者想要访问时允许多个同时读取者。
  • 不使用 BOOST 库。理想情况下,原生 C++11 或内置 linux 库,无需安装抽象库即可运行。
  • 不使用 pThread 实际线程,但可以使用那里的一些对象,这些对象将与 C++11 std::thread 一起工作。
  • 理想情况下可以处理运行中的进程崩溃。例如。使用 POSIX 信号量,如果进程在拥有信号量时崩溃,那么每个人都会被搞砸。我见过有人使用文件锁吗?

提前致谢

最佳答案

keeping shared memory to primitives only to avoid addressing problems

您可以跨程序在共享内存对象中使用指针,只要内存mmap到同一地址即可。这实际上是一个直截了当的命题,尤其是在 64 位上。有关实现细节,请参阅我编写的这个开源 C 库:rszshm - resizable pointer-safe shared memory .

Using POSIX semaphore if a process crashes while it has the semaphore, everyone is screwed.

如果你想使用操作系统介导的信号量,SysV 信号量有 SEM_UNDO,在这种情况下它会恢复。 OTOH pthread 提供了强大的互斥锁,可以嵌入和共享内存。这可用于构建更复杂的机制。

在信号量集中提供多个信号量的 SysV 方案,其中一组操作必须全部成功,否则调用 block ,也允许构建复杂的机制。可以使用一组三个信号量进行读/写锁定。

关于c++ - POSIX 共享内存跨进程同步 C++/C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35402366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com