我正在尝试提高我使用的框架的性能。

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

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

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

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

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

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


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


嘿,为答案欢呼,在你回答之前我已经解决了。最后,将共享成员声明为易失性就足够了。我相信发生的事情是编译器优化了 while(true) 循环中出现的访问。

@JohnNikolaou:这对于 AMD64 架构来说可能足够好,但对于其他架构来说可能还不够。您还应该添加障碍。