繁体   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