iOS 上的 C++ 原子

C++ atomic on iOS

我在 iOS 项目中有下一个独立的测试片段:

/// ...
std::atomic_bool ab;
ab.store(true);
bool expected = false;
while (!ab.compare_exchange_weak(expected, true));
assert(0);
// ...

假设ab没有被其他线程修改,我预计,循环将是无限的,但执行后我发现assert失败了。为什么会这样?

如果没有任何东西触及 ab 并且没有任何东西触及 expected,(并且没有其他线程 运行 可能会影响该区域的内存,)那么该断言不应触发...

除非编译器通过消除死代码来帮助您,即 while 循环什么都不做,所以不要包含它,因此您会遇到断言。检查您的汇编程序输出以确保或向循环中添加一个全局变量计数器,以便编译器不会为您杀死这个死代码。

compare_exchange_weak 将第一个参数更改为实际存在的参数。因此,在循环的第一次迭代之后,预期已更改为 true。然后将其反馈到 compare_exchange_weak 成功并继续使断言失败的循环中。