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

时间:2016-02-15 05:54:15

标签: c++ multithreading c++11 posix shared-memory

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

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

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

针对

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

提前致谢

1 个答案:

答案 0 :(得分:1)

  

将共享内存保留为原语只是为了避免解决问题

只要内存mmap到同一地址,您就可以在程序中使用指针和共享内存对象。这实际上是一个简单的命题,特别是在64位上。请参阅我为实现细节编写的这个开源C库:rszshm - resizable pointer-safe shared memory

  

如果进程在拥有信号量时崩溃,则使用POSIX信号量,每个人都被搞砸了。

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

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