2010-07-28 45 views
0

更具體地說,我已(簡化)如下:聯合會的揮發性和非揮發性成員的語義是什麼?

union foo 
    { 
    volatile int bits; 
    char data[sizeof(int)*CHAR_BIT]; 
    } 

如果我從來沒有進入第一sizeof(int)項目data,我可以依靠bits如預期的工作?

+0

你能更具體什麼你想實現? – kmalmur 2010-07-28 06:09:30

+0

@ mack369,我正在寫一個內存分配器,並且正在嘗試使其線程安全。 (Preemptivly:我這樣做主要是作爲相對低級別編程中的excersise,所以**不**使用更強大,測試良好等替代方案是有點暗示的。) – 2010-07-28 06:21:54

回答

2

基本上把結構的一個領域標記爲volatile是正確的。但是你必須記住volatile關鍵字的作用。它告訴編譯器不要優化對變量的訪問。值總是從內存中讀取,而不是從其寄存器中複製。

當您在評論中寫入時,您正試圖使內存分配線程安全。不幸的是,volatile並不能保證你可以從多個線程訪問它。如果您使用8位CPU,則對整數值的訪問不是原子操作,因此您的程序無法正常工作。

+0

我也使用原子內存訪問builtins (特別是gcc的__sync_ * stuff *),這應該是訪問線程安全的另一半(對吧?)。 (我也假設CPU有足夠大的字大小,「int」將會是一個字)。 – 2010-07-28 06:45:56

+0

我還沒有使用這種使內存訪問原子化的方式。我更喜歡手動做 - 這是更便攜的方式。 – kmalmur 2010-07-28 08:13:35

+0

手動原子內存訪問的任何參考/教程? – 2010-07-28 08:43:28

0

volatile決不是對實現鎖有用。我不是在講理論上的;它失敗,你有競爭條件,即使在單CPU /單核心環境。使真正的原子鎖定原語的唯一方法是使用cpu的鎖定原語(x86,鎖前綴)編寫程序集。

事實上,有可能是一種方法只volatile但只有這樣的鎖定機制,我知道需要O(n)空間,n是線程的數量,這使得相當無用獲得通過,如果可能的線程數是未知提前。

+0

我在哪裏說我在寫鎖?我試圖寫一個無鎖內存分配器。 (我放棄並添加了鎖,但不以任何方式與此問題相關。) – 2010-07-28 12:34:44

+0

對不起。出於好奇,你對無鎖實現的想法是什麼? – 2010-07-29 08:44:16

+0

我試圖在整個malloc/free操作中保持內存緩存處於一致狀態。這樣做與個人塊明顯微不足道,但我無法弄清楚如何保持自由列表健全。如果我有任何新的想法,我可能會回來。 – 2010-07-29 16:12:57