Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ POSIX跨进程共享内存同步C++/C++;11_C++_Multithreading_C++11_Posix_Shared Memory - Fatal编程技术网

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

C++ POSIX跨进程共享内存同步C++/C++;11,c++,multithreading,c++11,posix,shared-memory,C++,Multithreading,C++11,Posix,Shared Memory,问题(简而言之): 我正在使用POSIX共享内存,目前只使用POSIX信号量,我需要控制多个读卡器、多个写卡器。我需要帮助,了解我可以使用哪些变量/方法在下面描述的限制范围内控制访问。 我已经找到了一种我想要实现的方法,但我不确定在使用POSIX共享内存时可以使用什么方法来实现它 我的发现 这个链接有我想使用的算法,但我不确定如何用共享内存实现它。我是否以某种方式将类存储在共享内存中?这就是我需要帮助的地方。 我不确定的原因是我做了很多研究,指出保持原语共享内存只是为了避免解决问题,STL对象无

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

我的发现 这个链接有我想使用的算法,但我不确定如何用共享内存实现它。我是否以某种方式将类存储在共享内存中?这就是我需要帮助的地方。 我不确定的原因是我做了很多研究,指出保持原语共享内存只是为了避免解决问题,STL对象无法使用

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

针对

  • 必须能够在运行多个可能希望访问的C++11 std::thread的2+个进程之间共享。即多个写入程序(一次独占一个写入程序),同时在没有写入程序需要访问时允许多个同时读卡器
  • 不使用BOOST库。理想情况下是本机C++11或内置linux库,无需安装抽象库即可工作
  • 不使用pThread实际线程,但可以使用其中的一些对象来处理C++11 std::thread
  • 理想情况下,可以在运行时处理进程崩溃。例如,使用POSIX信号量如果一个进程在拥有该信号量时崩溃,那么每个人都会陷入困境。我见过有人使用文件锁吗
提前谢谢

仅为原语保留共享内存以避免解决问题

只要内存
mmap
ed到相同的地址,就可以在程序中使用和指向共享内存对象的指针。这实际上是一个直截了当的命题,特别是在64位上。有关实现的详细信息,请参阅我编写的这个开源C库:

使用POSIX信号量如果进程在拥有信号量时崩溃,那么每个人都会倒霉

如果要使用OS中介的信号量,SysV信号量具有SEM_UNDO,在本例中可以恢复。otohpthread提供了健壮的互斥锁,可以在共享内存中嵌入和共享。这可以用来构建更复杂的机制


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

尝试一些我发现的东西,仍然没有用。如果运行两个完全不同的可执行文件,这里的解决方案就不起作用。我把叉子注释掉,运行它。然后我注释掉父部分和互斥初始化器,重新编译并运行forkedson进程。不起作用。但是,如果您从同一个可执行文件按原样运行,它会工作……谢谢您提供的信息,我仍然不确定这是否是我想要的方式,因为我可能会有许多读写器访问这个共享内存,所以在新进程启动时尝试获得相同的内存对齐方式即使没有问题也会很麻烦不幸的是,由于一些未知的原因,它无法在两个单独的可执行文件中工作。健壮的共享pthread互斥体确实可以在单独的可执行文件中工作-这就是重点。它们利用系统调用来启用恢复。看看musl实现:谢谢@dancancode,我发现互斥锁可以工作,但是pthread_cond_t即使在应用了互斥锁pthread_condattr_init(&condAttEx)等属性时也不会发出accross信号;pthread_condattr_setpshared(&condAttEx,pthread_PROCESS_SHARED);pthread_cond_init(condEx和condAttEx);那太不幸了。如果你想开始一个新的问题,并发布一些代码,也许我们可以找出发生了什么。