问题(简而言之): 我使用POSIX共享内存,目前只使用POSIX信号量,我需要控制多个读者,多个编写者。我需要帮助我可以使用哪些变量/方法来控制下面描述的限制内的访问。 我找到了一种我想要实现的方法,但我不确定在使用POSIX共享内存时我可以用什么方法来实现它。
我发现了什么 https://stackoverflow.com/a/28140784 此链接具有我想要使用的算法,但我不确定如何使用共享内存来实现它。我是否以某种方式将课程存储在共享内存中?这是我需要帮助的地方。 我不确定的原因是我的很多研究,只是为了避免解决问题和STL对象无法使用而将点共享内存保留在原语中。
注意: 对于我的所有多线程我都使用C ++ 11功能。这个共享内存将使用C ++ 11 std :: threads完全独立的程序可执行文件,任何进程/可执行文件的任何线程都需要访问它。我已经避免了我的任何多线程的Linux pthread,并将继续这样做(除非它的控制变量只是实际的pThreads)。
针对
的解决方案参数提前致谢
答案 0 :(得分:1)
将共享内存保留为原语只是为了避免解决问题
只要内存mmap
到同一地址,您就可以在程序中使用指针和共享内存对象。这实际上是一个简单的命题,特别是在64位上。请参阅我为实现细节编写的这个开源C库:rszshm - resizable pointer-safe shared memory。
如果进程在拥有信号量时崩溃,则使用POSIX信号量,每个人都被搞砸了。
如果你想使用OS介导的信号量,SysV信号量有SEM_UNDO,在这种情况下可以恢复。 OTOH pthread提供强大的互斥锁,可以在共享内存中嵌入和共享。这可以用来构建更复杂的机制。
在信号量集中提供多个信号量的SysV方案,其中一组动作必须全部成功,或者调用块,也允许构建复杂的机制。可以使用一组三个信号量进行读/写锁定。