簡體   English   中英

使用 Load-link/store-conditional 來防止 ABA 的無鎖 C++11 示例?

[英]Lock-free C++11 example using Load-link/store-conditional to prevent ABA?

在使用比較和交換 (CAS) 技術編寫無鎖代碼時,存在一個稱為 ABA 問題的問題:

http://en.wikipedia.org/wiki/ABA_problem

僅在值“A”上進行比較是有問題的,因為在兩次觀察之間仍然可能發生寫入。 我繼續閱讀並找到了這個解決方案:

http://en.wikipedia.org/wiki/LL/SC

在計算機科學中,load-link 和 store-conditional (LL/SC) 是多線程中用於實現同步的一對指令。 加載鏈接返回內存位置的當前值,而后續存儲條件到同一內存位置將僅在加載鏈接后該位置沒有發生更新時才存儲新值。 總之,這實現了無鎖原子讀-修改-寫操作。

如何修改典型的 C++ 無鎖 CAS 技術以使用上述解決方案? 有人能舉一個小例子嗎?

我不介意它的 C++11/x86、x86-64 Linux 是否特定(最好沒有 Win32 答案)。

LL/SC 是由某些體系結構(例如 SPARC)實現的指令,以形成更高級別的原子操作的基礎。 在 x86 中,您可以使用LOCK前綴來實現類似的目標。

為了避免在 x86 上使用LOCK的 ABA 問題,您必須提供自己的保護以防止干預存儲。 一種方法是在相關內存附近存儲一個代號(只是一個遞增的整數)。 每個更新程序都會進行一次原子比較/交換,范圍足夠寬以包含數據和序列號。 只有找到正確的數據和正確的數字,更新才會成功。 同時,它更新數字以便其他線程看到變化。

您會注意到 x86 一直 (?) 提供了CMPXCHG寬度為機器字兩倍的CMPXCHG指令(參見CMPXCHG8B和更高版本的CMPXCGH16B ),可用於此目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM