C++ 原子 compare_exchange_weak

C++ Atomic compare_exchange_weak

当我使用这个功能时发生了一些让我难以理解的事情 代码:

#include<iostream>
#include<atomic>
int main()
{
    std::atomic_size_t example;
    size_t expect = 1000;
    example.store(100, std::memory_order_release);
    //Now example.load() is 100;
    auto result = example.compare_exchange_weak(expect, 50, std::memory_order_relaxed);
    //Now result is zero(false) and example.load() is 100,I knew it would.
    result = example.compare_exchange_weak(expect, 50, std::memory_order_relaxed);
    //But now !!! result is One(true)! and example.load() is 50 Why???
}

函数执行后会发生什么?为什么两次执行不同? 我不明白为什么会这样,所以我真的很希望你能回答我的question.Thank你。

我完善了这段代码,现在可以正常编译和执行了,它只是一个线程。

它被称为交换是有原因的。

调用example.compare_exchange_weak(expected, value);大致对应以下一段代码原子地完成:

if (expected==example){
    example = value;
    return true;
}
else
{
    expected = example;
    return false;
}

在您的第一次调用中,else 分支的意思是 expected<-100,因为 100 是 example 中的当前值,未更改。

下一次调用比较 exampleexpected 并且它们显然相等,因此采用 if 分支。因此 example==100 在第二次调用之后。

有关详细信息,请参阅 documentation

此行为很有用,因为您始终可以将 expected 值保存在安全的地方并使用“burner”变量,这样您还可以获得 example 中当前存储的值。另一种看待这个问题的方式:在调用之后 expected 将始终包含调用之前存储在 example 中的值。