簡體   English   中英

原子比較運算符(無交換)

[英]Atomic Compare Operator (No swap)

我正在尋找一個比較器運算符,可用於在C ++ 11下原子地比較兩個原子變量。 在這里,我不想交換存儲在這些原子obj下的值,所以我對compare_and_swap函數不感興趣。 請參考以下示例:

std::atomic<uint32_t> readIdx{0};
std::atomic<uint32_t> writeIdx{0};

while(writeIdx + 1 == readIdx)   <<<<------------------
{
     std::this_thread::yield();
}

我想要的只是用箭頭線表示的代碼是原子的。 可能嗎? 如果沒有, writeIdx == readIdx是原子操作嗎?

這是不可能的,因為它沒有任何意義。

您的代碼將獲得有效的比較值,但它幾乎不能保證何時獲得這些值。 因此,如果檢查成功,您將知道的是, readIdx在某個時間點等於某個時間點產生的writeIdx + 1的值。 這兩個時間點大多是無關的。 特別是,允許​​在任何單個時間點readIdx的值等於writeIdx + 1的值,但檢查仍然成功。

這就是為什么這不是一個真正的問題:你將無法不引入額外鎖定的情況下同時建立兩個原子的概念。 問題是,無論代碼取決於該條件,都需要成為執行檢查的同一原子執行塊的一部分。 如果不是,則在代碼完成執行之前條件可能會更改。

另一方面,如果代碼的任何部分都不依賴於條件,那么首先將它作為概念引入是沒有意義的。

所以這里是如何繼續:返回並重新評估您是否真的擁有代碼,這些代碼取決於兩個變量在代碼執行時必須具有預期值的條件。 如果是這種情況,您需要使用鎖保護該代碼。 如果沒有,您可能根本不需要檢查條件,因為您當前代碼提供的保證可能太弱而無法實際使用。

暫無
暫無

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

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