2011-02-09 94 views
19

我仍然不確定是否我不理解或文檔沒有明確的表述。 以下摘錄已採取從最新的草案(N3126,部分29.6):std :: atomic | compare_exchange_weak與compare_exchange_strong

bool atomic_compare_exchange_weak(volatile A* object, C * expected, C desired); 
bool atomic_compare_exchange_weak(A* object, C * expected, C desired); 
bool atomic_compare_exchange_strong(volatile A* object, C * expected, C desired); 
bool atomic_compare_exchange_strong(A* object, C * expected, C desired); 
bool atomic_compare_exchange_weak_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_weak_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_strong_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool atomic_compare_exchange_strong_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure) volatile; 
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure) volatile; 
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure); 
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile; 
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst); 
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile; 
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst); 

備註:弱比較和交換 操作可能會意外失敗,也 是,返回false而留下 指向的內存內容 預計在操作之前是 與對象 相同,與預期的 之後的操作相同。 [注意:這種虛假的 故障使得能夠在更廣泛的 類別的機器(例如,裝載鎖定的 存儲條件機器)上執行 比較和交換。 A 虛假故障的後果是 幾乎所有使用弱 比較和交換將在 循環。

那麼,這是什麼意思?首先,它可能虛假地出現?!它爲什麼這樣做?他們如何定義'可能'?其次,我不知道爲什麼,但我仍然不知道「_strong」和「_weak」後綴的功能有什麼區別。

希望有人能幫忙;) 最好的問候。

編輯: 這就是我的libstdC++已經找到 - 執行(atomic_0.h):

bool compare_exchange_weak(
    __integral_type& __i1, 
    __integral_type __i2, 
    memory_order __m1, 
    memory_order __m2 
) 
{ 
    __glibcxx_assert(__m2 != memory_order_release); 
    __glibcxx_assert(__m2 != memory_order_acq_rel); 
    __glibcxx_assert(__m2 <= __m1); 
    return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1); 
} 

bool compare_exchange_strong(
    __integral_type& __i1, 
    __integral_type __i2, 
    memory_order __m1, 
    memory_order __m2 
) 
{ 
    __glibcxx_assert(__m2 != memory_order_release); 
    __glibcxx_assert(__m2 != memory_order_acq_rel); 
    __glibcxx_assert(__m2 <= __m1); 
    return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1); 
} 
+0

我添加了STL標籤,希望它能帶來Howard Hinnant,他一直在用libC++來實現這些,所以他應該知道這個。 – 2011-02-09 12:30:01

回答

7

它與硬件實現共享內存一致性模型做。對於實現某種寬鬆一致性模型(例如發佈語義)的硬件體系結構,上面提到的強大操作可能會帶來很高的開銷,因此專家可以使用較弱的表單來實現算法,這些算法在這些寬鬆的一致性架構。

欲瞭解更多信息,請參閱

http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-7.pdf

第12章及附錄C中http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html

+1

但是,是不是它加強或削弱了memory_order參數內存排序模型? – 0xbadf00d 2011-02-09 14:34:02

+0

不,這是由硬件指定的。該參數指定了算法正確運行所需的最小排序順序。然後調用C++ 0x實現以確保至少指定的順序是提供;強烈排序的archit像x86這樣的演講,很可能強者和弱者的實施都是相同的。 – janneb 2011-02-09 15:56:39

25

的說明給出了一個線索,指LL/SC架構。來自維基百科的文章:

如果發生任何更新,即使已恢復由load-link讀取的值,store-conditional也會失敗。因此,LL/SC對比比較和交換(CAS)更強,如果舊值已恢復,則不會檢測更新(請參閱ABA問題)。

如果沒有對相關內存位置進行併發更新,LL/SC的真正實現並不總是成功。兩個操作之間的任何異常事件(例如上下文切換,另一個負載鏈接或甚至(在許多平臺上)另一個加載或存儲操作)都會導致存儲條件虛假故障。

在LL/SC芯片的compare_exchange將在LL/SC的角度來實現,其可以意外失敗,所以需要compare_exchange_strong額外的開銷在故障的情況下,以重試。同時提供compare_exchange_strongcompare_exchange_weak允許程序員來決定他們是否希望庫處理虛假故障(在這種情況下,他們會使用compare_exchange_strong或者如果他們要處理它在自己的代碼(在這種情況下,他們會使用compare_exchange_weak

相關問題