通过 SHM 的 IPC 用于 C++ 和并发内存访问

IPC through a SHM for C++ and concurrent memory accesses

我正在努力提高我使用的框架的性能。

目前它使用共享内存space(shm),以允许两个 C++ 线程之间的进程间通信。对 SHM 的控制通过信号量传递。这是当前运行良好的系统,尽管比我想要的稍慢,并且需要标志进行通信。

我考虑过使用 master/slave 配置,信号仅由任一侧驱动。因此,诸如 Slave_Ready 之类的信号将由从设备写入,并由主设备读取以表明从设备可以接受请求。

我希望这种行为得到支持,因为只有一侧在写入信号。然而,当从机轮询主机驱动的信号时,主机似乎无法更改信号的值。我已经在 Eclipse 中完成了此操作,当我尝试单步执行写入指令时,它并没有得到执行。这是它的样子:

shmp->MREADY = true; // in the same time the slave is polling this signal. 

所以这条指令永远不会通过。 据我了解,read/write 应该是无关紧要的。写入应该通过,或者应该由内存控制器作为原子请求处理。即使读取发生在写入的中途,我也没有数据损坏的问题。如果读取结果为真,它会遍历并访问在就绪信号置位之前写入的数据。如果它读取错误,它会在下一个周期访问信号。无论哪种方式,数据完整性都会得到保留。因此,我希望这会毫无问题地工作,但显然这里有一些东西在起作用。

是否不支持并发 read/write?轮询读取请求的持续垃圾邮件是否淹没了写入请求?

我建议对 MREADY 成员使用 C++11 的 std::atomic<>。或者至少在分配后发出 std::atomic_thread_fence(std::memory_order_acq_rel)