2014-12-05 36 views
1

我正在構建一個程序,其中一個變量只被一個線程(原子,兩個方向上的完全內存屏障)修改,並讀取多個線程。讀線程是否需要以原子方式讀取變量或者簡單的讀取就足夠了?一位作家,無鎖應用程序中的多個閱讀器

通常(我用gcc,但我想這個概念是語言獨立的)

在寫線程:

__atomic_add_fetch (&a, 1, __ATOMIC_SEQ_CST); 

在閱讀線程:

int b = __atomic_load_n (&a, __ATOMIC_SEQ_CST); 

/* OR */ 

int b = a; 

我猜測是,如果唯一的作家在兩個方向上都設置了完全的屏障,那麼應該沒有競爭條件,但我可以似乎沒有發現任何確認...

謝謝!

+1

一個簡單的讀取就是UB的數據競賽。 – usr 2014-12-05 13:01:14

+0

UB代表什麼? – MindTailor 2014-12-05 16:05:23

+0

這是未定義的行爲。 – usr 2014-12-05 16:08:35

回答

1

爲了安全起見,您應該使用seq_cst獲取內存模型。編譯器或CPU可以執行一些技巧來優化緩存或寄存器的使用,並且不會以不同的順序加載值或加載,因此使用特定負載的屏障可能是一個好主意。

將變量標記爲volatile也可以提供幫助。

+1

我知道這會更安全,但是我必須做到嗎?如果我不想要一個最新的價值,那麼不應該需要揮發性的東西? – MindTailor 2014-12-05 16:07:54

+0

沒有明確的答案。這取決於你的特定情況。如果您不需要最新的值,則可能不需要原子加載。當然,除非編譯器/ CPU優化它,否則這個值只加載一次,永遠不會重新加載(這在某些邊界情況下是可能的)。 – Tomo 2014-12-06 10:45:05

相關問題