簡體   English   中英

為什么 compare_exchange_strong 會因 std::atomic 而失敗<double> , 標准::原子<float>在 C++ 中?</float></double>

[英]Why does compare_exchange_strong fail with std::atomic<double>, std::atomic<float> in C++?

我正在閱讀 C++ Concurrency in Action 第 5 章。本章說,

請注意,盡管您可以使用 std::atomic<float> 或 std::atomic<double>,因為內置浮點類型確實滿足與 memcpy 和 memcmp 一起使用的標准,但在比較交換強。 即使舊存儲值的值與比較值相等,如果存儲值具有不同的表示形式,操作也可能失敗。 請注意,浮點值沒有原子算術運算。 如果您將 std::atomic<> 與定義了相等比較運算符的用戶定義類型一起使用,並且該運算符與使用 memcmp 的比較不同,那么您將獲得與 compare_exchange_strong 類似的行為 - 操作可能會失敗,因為否則 -相等的值有不同的表示。

但我不明白為什么會這樣。

  1. 如果 float 和 double 可以使用 memcpy 和 memcmp,那么像 compare_exchange_strong 這樣的原子操作有什么問題?

  2. 我也不能使用 compare_exchange_weak 嗎?

  3. 以上段落,“差異表示”是什么意思?

IEEE-754 浮點數使用有符號/大小格式來確定尾數的符號。 也就是說,有一個符號位,然后有代表一個正數的位。 如果設置了符號位,則該數字被解釋為負數。

當然,如果所有的數字(和指數)位都是 0,並且符號位被設置,那么就會產生“數字”-0.0。 就現實世界的人類數學而言,沒有“負0”。 所以從邏輯上講,這樣的數字應該被視為等於+0.0。 而普通的浮點比較邏輯正是這樣做的。 但這兩個等價值以不同的二進制表示形式存儲; 一個設置了符號位; 另一個沒有。

因此,如果您對兩個浮點值的二進制表示進行比較(這是atomic_compare_*操作將執行的操作),則 -0.0不會被視為等於 +0.0。

還有其他情況下 IEEE-754 相等性測試可以 go 錯誤,但這是最簡單的解釋。

暫無
暫無

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

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