我有一个被多个进程共享的内存,这些进程以某种特定方式解释这块内存。
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
我如何为一个随机的内存位置(解释为上面的DataBlock计数器)实现这个?我可以保证地址按照架构要求对齐(x86 Linux)。
- 如何使更新操作具有原子性 - 怎么做?(即
atomicupdate(addr, newvalue)
) - 多核内存同步 - (即
memorysync(addr)
)- 我唯一能想到的方法是使用std::atomic_thread_fence(std::memory_order_release)
,但这将“建立所有原子和松散原子存储的内存同步顺序” - 这对我来说过于复杂了 - 我只想同步计数器位置。感谢任何想法。
atomic<int>
吗?只要atomic<int>
是无锁的(标准显式地提到了进程间共享内存作为这些用例),那应该可以工作。但是你不能仅仅为一个随机地址获取一个原子变量(请参见https://dev59.com/vGoy5IYBdhLWcg3wJKoq#8749474)。@Kerrek SB:实际上,这种情况在[atomics.lockfree]中的最终草案中有所提及。 - Grizzly