我有一個共享內存之間的多個進程以特定方式插入內存。 例如:原子訪問共享內存
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