2012-11-04 61 views
2

我有下面的C代碼:在這種情況下,輕(est)體重GCC記憶障礙是什麼?

... 
data[index] = something; 
a_write_memory_barrier(); 
index = new_index; 
... 

的代碼不會被鎖定保護(其他人只是閱讀dataindex),我要確保data[index]index更新前存儲。在這段代碼中有內存寫入和其他變量的讀取,但它們並不重要,所以GCC可以自由地對它們進行重新排序(我希望它可以這樣做以進行優化)。只要保證data[index]index的順序就夠了。 a_write_memory_barrier()應該如何實現這個目標?

+1

見http://stackoverflow.com/questions/8896092/is-there-a-compiler-memory-barrier-for-a-single-variable – dbrank0

回答

1

如果您需要關心亂序執行(您可能在分佈式框架中工作),那麼您需要考慮負載負載,商店存儲和完整的障礙,當然如果您的架構支持TSO(總店鋪順序)比你不關心商店的障礙,你的寫操作將按照代碼中的順序進行。

如果從另一方面擔心編譯器重新排序,想到用揮發油(谷歌它)

在你的榜樣店屏障將解決你的問題,這樣的屏障的實現依賴於架構和你使用的編譯器:

eg

爲SPARC和gcc編譯:

#define MEMBAR_STORESTORE() asm volatile ("membar #StoreStore":::"memory") 
+0

的你提供的代碼是一個內存屏障,可以防止任何商店的重新排序和周圍的負載。我只是想防止重新排序索引和數據[索引],而不是其他。 –

+0

@ W.Sun:我已更新代碼 – Michael

+0

嗯...謝謝,但是,如果有的話,說'a = 1; ...(代碼塊在問題中)... b = 2;','MEMBAR_STORESTORE()'是否也會阻止'a = 1'和'b = 2'的重新排序?有什麼東西只是防止指定的重新排序?在這個問題中,只要保持寫入'data [index]'和寫入'index'的順序,其他寫入就可以重新排序。 –

相關問題