我正在用C編寫一個程序。爲了簡單起見說:有很多變量,許多線程都可以讀取和寫入。每次寫入它們時,都會通過原子交換(GCC原子操作,同步和交換)進行寫入。每次讀取其中一個變量時,是否需要使用原子加載?還是原子寫入足以避免在數據寫入過程中讀取數據?C原子操作,如果寫入都是原子交換,我需要原子加載嗎?
注意,任何地方,需要從這些瓦爾第一張價值的一個使用數據:
int success = 0;
while (!success) {
int x = shared_x;
... work with x, result in y ...
success = cmp_swap(&shared_x, x, y);
}
我的問題不是關於比賽的數據,那就是我不擔心我可能會丟失數據。我擔心的是,shared_x的價值可能會在我閱讀的一半時發生變化。假設它是一個8字節的整數,這是否是一個潛在的問題:說shared_x是一個64位整數,8個字節。是否有可能我的x = shared_x將複製前4個字節,然後以原子方式寫入shared_x,然後此語句完成讀取第二個4字節。這將導致x包含舊值shared_x的前4個字節,以及新shared_x的最後4個字節。我懷疑原子交換(http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html - 使用__sync_bool_compare_and_swap)中的內存屏障足以防止這種情況發生......但我不確定。
更新了我的示例,現在它顯示了在計算新值時寫入內容時發生了什麼,它只是重新開始並重試。 – Exodist 2013-02-23 06:16:28
@Exodist這裏需要的是整個程序,而不僅僅是它的一部分。你需要自己做分析。假設競爭條件並遵循程序邏輯。如果比賽條件完全沒有任何不良影響,那麼你很好。您也可以手動引入競賽條件並觀察。 – 2013-02-23 06:18:55
我不能正確地問我的問題。我不關心工作的同步。我會在上面更新我的問題。 – Exodist 2013-02-23 06:24:29