我在多个进程之间有一个共享内存,该内存以某种方式与内存交织在一起。
前任:

DataBlock {
int counter;
double value1;
double ...    }

我想要的是原子地更新/增加计数器。并在该地址上进行内存释放。
例如,如果我不使用共享内存,它将类似于
std::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release     operation on the affected memory location making the write visible to other threads

最佳答案

我无法在这里授权回答,但我可以提供可能有用的相关信息。

  • Mutexes可以在共享内存中创建和/或创建为跨进程。 Pthread有一个特殊的创建标志,我不记得它是使用共享内存还是共享一个句柄。 linux“futex”可以直接使用共享内存(请注意,用户地址可能有所不同,但是底层实际地址应该相同)
  • 硬件原子在内存上起作用,而不在处理变量上起作用。也就是说,您的芯片将不在乎哪个程序正在修改变量,因此,最低级别的原子自然会被交叉处理。围栏也是如此。
  • C++ 11无法指定跨进程原子。但是,如果它们是无锁的(检查标志),则很难看到编译器如何实现它们,从而使跨进程无法工作。但是您会对工具链和最终平台充满信心。
  • CPU依赖关系还保证跟踪真实的内存地址,因此,只要您的程序以线程形式正确,它的多进程形式(就可见性而言)也应该正确。
  • Kerrek是正确的,抽象机并未真正提及多个进程。但是,它的同步详细信息是以这样的方式编写的:它们与多线程一样,同样适用于进程间。这与#3有关:编译器很难解决这个问题。

  • 简短的答案是,没有符合标准的方法可以做到这一点。但是,依靠标准定义多线程的方式,您可以对质量编译器做出很多假设。

    最大的问题是是否可以简单地将原子分配到共享内存中(新放置)并工作。显然,这只有在它是真正的硬件原子的情况下才有效。但是我的猜测是,使用优质的编译器/库,C++原子应该可以在共享内存中找到。

    玩得开心,验证行为。 :)

    关于c++ - 原子访问共享内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8759429/

    10-12 00:43
    查看更多