2016-08-01 104 views
1

何時可以通過使用內存障礙來避免鎖?就像在這種情況下一樣:Consumer-Producer-Wiki(最後一種實現是使用內存屏障,並且所有休息都使用鎖或信號量。)鎖VS內存障礙

在鎖之類的情況下使用內存屏障是否更好?如果是,爲什麼?

使用內存障礙可以避免鎖的最常見情況是什麼?

+0

你已經知道了答案,如果內存屏障總是會更好,那麼在鎖定原語中就沒有任何意義。谷歌「活鎖和飢餓」來學習更多。 –

+0

@Hans Passant需要了解使用內存屏障的場景。你可以點亮這個嗎? – adisticated

+0

是@Hans,在任何情況下鎖都不能避免。這就是爲什麼複雜的問題擺在首位。我想他想知道可以避免不必要鎖定的情況。 – v78

回答

0

根據定義,互斥體需要執行內存屏障。如果一個互斥體沒有包含內存屏障,那麼對它提供的獨佔訪問數據的操作可能會在關鍵區域之外重新排序。

另外,互斥體實現通常需要執行內存屏障本身,否則互斥體本身可能會重新排序。

換句話說,互斥體的實現包含一個內存屏障,以便執行強制互斥所必需的原子鎖定,但即使不需要,互斥體也會包含內存屏障,否則它不會「非常有用。

結論:如果你不想讓你的代碼破壞,即使在需要內存屏障的地方也可以使用鎖定。

inline void mb_() 
{ 
    mutex_t mtx; 
    mutex_init(&mtx); 
    mutex_lock(&mtx); 
    mutex_unlock(&mtx); 
} 

如果您要瞄準性能,您可能需要先進的技術。

+0

鎖是多一點的開銷而不僅僅是使用記憶障礙? – adisticated

+0

互斥量內部調用mem_fence類的指令,而這種類型的代碼塊開銷很小。任何線程都會在鎖上等待的機會很小。 – v78