【问题标题】:POSIX Shared Memory Sync Across Processes C++/C++11POSIX 跨进程共享内存同步 C++/C++11
【发布时间】:2016-05-25 22:47:54
【问题描述】:

问题(简​​而言之): 我正在使用 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 信号量,每个人都被搞砸了。我见过有人使用文件锁吗?

提前致谢

【问题讨论】:

  • 尝试了一些我发现的东西,但仍然无济于事。 stackoverflow.com/questions/20325146/… 如果您运行两个完全独立的可执行文件,这里的解决方案将不起作用。我注释掉了叉子,运行它。然后我注释掉父部分和互斥体初始化器并重新编译并运行分叉的子进程。不工作。但是,如果你从同一个可执行文件中按原样运行,它就可以工作.....

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您提供的信息,我仍然不确定这是否是我想要的方式,因为我可能会有很多读者和作者访问这个共享内存,所以试图获得相同的内存对齐如果没有问题,新流程的启动会很麻烦。
  • 我查看了 OTOH pthread 并且如上所述(在我对我的问题的第一条评论中)不幸的是,由于某些未知原因,它无法从两个单独的可执行文件中工作..
  • 强大的共享 pthread 互斥锁可以从单独的可执行文件中工作——这就是重点。他们利用系统调用来启用恢复。看看 musl 的实现:git.musl-libc.org/cgit/musl/tree/src/thread/…
  • 感谢@dancancode,我发现互斥锁有效,但即使应用了像互斥锁 pthread_condattr_init(&condAttEx); 这样的属性,pthread_cond_t 也不会发出信号。 pthread_condattr_setpshared(&condAttEx, PTHREAD_PROCESS_SHARED); pthread_cond_init(condEx, &condAttEx);
  • 这很不幸。如果您想提出一个新问题并发布一些代码,也许我们可以弄清楚发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多