我有一个共享内存之间的多个进程以特定方式插入内存。 例如:原子访问共享内存
DataBlock {
int counter;
double value1;
double ... }
我要的是计数器进行更新/原子递增。并在该地址发生内存释放。 如果我使用的werent共享内存,例如,它会像
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
如何做到这一点的随机存储位置(解释为数据块计数器>以上)。我可以保证该地址按照架构(x86 linux)的要求对齐
- 使更新原子化 - 如何? (即atomicupdate(addr,newvalue))
- 内存同步多核 - (即memorysync(addr)) - 我可以看到的唯一方法是使用std :: atomic_thread_fence(std :: memory_order_release) - 但这将“建立内存所有原子和放松的原子商店的同步排序“ - 这对我来说是过度的 - 我只想让计数器位置同步。 欣赏任何想法。
我只是猜测,但我的印象是,C++编程模型没有“进程”的概念,内存模型没有“共享内存”的概念,所以我怀疑标准本身会使任何保证。共享内存非常依赖于平台功能,因此请查阅您的平台文档。 – 2012-01-06 14:59:51
你可以在你的DataBlock中放入一个'atomic'吗?只要'atomic '是无锁的(标准显式提及内存在进程间共享作为这些用例的用例),这应该工作。不,你不能只是得到一个随机地址原子(见http://stackoverflow.com/questions/8749038/how-to-use-stdatomic-efficiently/8749474)@Kerrek SB:实际上,这种情况被提及[atomics.lockfree]在最后的草稿中。 –
Grizzly
2012-01-06 15:22:46
@Grizzly:你的意思是非规范性说明29.4/3?非常有趣,我不知道。 – 2012-01-06 15:26:40