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
中的当前值,未更改。
下一次调用比较 example
和 expected
并且它们显然相等,因此采用 if 分支。因此 example==100
在第二次调用之后。
有关详细信息,请参阅 documentation。
此行为很有用,因为您始终可以将 expected
值保存在安全的地方并使用“burner”变量,这样您还可以获得 example
中当前存储的值。另一种看待这个问题的方式:在调用之后 expected
将始终包含调用之前存储在 example
中的值。
当我使用这个功能时发生了一些让我难以理解的事情 代码:
#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
中的当前值,未更改。
下一次调用比较 example
和 expected
并且它们显然相等,因此采用 if 分支。因此 example==100
在第二次调用之后。
有关详细信息,请参阅 documentation。
此行为很有用,因为您始终可以将 expected
值保存在安全的地方并使用“burner”变量,这样您还可以获得 example
中当前存储的值。另一种看待这个问题的方式:在调用之后 expected
将始终包含调用之前存储在 example
中的值。