簡體   English   中英

比較和交換原子操作與加載鏈接/存儲條件操作

[英]compare-and-swap atomic operation vs Load-link/store-conditional operation

在 x86 處理器下,我不確定比較和交換原子操作與加載鏈接/存儲條件操作之間的區別。 后者比前者更安全嗎? 是不是第一個比第二個好?

原子原語有三種常見的 styles:Compare-Exchange、Load-Linked/Store-Conditional 和 Compare-And-Swap。

CompareExchange 操作將自動讀取 memory 位置,如果它與比較值匹配,則存儲指定的新值。 如果讀取的值與比較值不匹配,則不進行存儲。 在任何情況下,操作都會報告讀取的原始值。

Compare-And-Swap 操作類似於 CompareExchange,除了它不報告讀取的值——僅報告讀取的任何值是否與比較值匹配。 請注意,CompareExchange 可用於實現 Compare-And-Swap,方法是讓它報告從 memory 讀取的值是否與指定的比較值匹配。

LL/SC 組合允許存儲操作以某些外部影響是否可能影響目標為條件,因為它的值被加載。 特別是,它保證如果存儲成功,則該位置根本沒有被外部代碼寫入。 即使外部代碼寫入了一個新值,然后重新寫入了原始值,也保證會導致條件代碼失敗。 從概念上講,這可能會使 LL/SC 看起來比其他方法更強大,因為它不會有“ABA”問題。 不幸的是,LL/SC 語義允許存儲自發失敗,並且隨着加載和存儲之間代碼復雜性的增加,自發失敗的概率可能會迅速上升。 雖然使用 LL/SC 直接實現類似原子增量的東西比使用它來實現比較和交換,然后在需要的情況下使用該比較和交換實現來實現原子增量更有效要在加載和存儲之間做很多事情,通常應該使用 LL-SC 來實現比較和交換,然后在 load-modify-CompareAndSwap 循環中使用該比較和交換方法。

在這三個原語中,Compare-And-Swap 是最不強大的,但它可以根據其他兩個中的任何一個來實現。 CompareAndSwap 可以很好地模擬 CompareExchange,盡管在某些極端情況下,這種模擬可能會鎖定。 CompareExchange 和 Compare-And-Swap 都無法提供與 LL-SC 一樣強大的保證,盡管可以可靠地放置在 LL/SC 循環中的有限代碼量限制了其保證的有用性。

x86 不提供 LL/SC 指令。 查看wikipedia上的平台。 另請參閱此SO question

暫無
暫無

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

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