C++ std::atomic 用于用户定义的数据类型
C++ std::atomic for user defined data types
我无法理解和编写与用户定义数据类型的以下原子库功能相关的代码:
std::atomic::compare_exchange_weak,
std::atomic::compare_exchange_strong
bool compare_exchange_weak( T& expected, T desired,
std::memory_order success,
std::memory_order failure );
bool compare_exchange_strong( T& expected, T desired,
std::memory_order success,
std::memory_order failure );
所以,如果我有以下琐碎的 class,我如何在那个琐碎的 class 上使用 compare_exchange_weak / compare_exchange_strong 原子库方法?
class A
{
public:
void Show()
{
std::cout << "Called\n";
}
};
我不确定我们应该在方法中为用户定义的数据类型设置什么预期/期望值 - 例如 class A?
您的class没有数据,因此不需要使用std::atomic<A>
。如果你想知道如何使用std::atomic
和UDT,你可以添加一个成员数据然后使用下面的代码
#include <iostream>
#include <atomic>
class A
{
public:
int a;
void Show()
{
std::cout << a << "\n";
}
};
int main( ) {
A a1{1};
A a2{2};
std::atomic<A> atomicA{a1};
atomicA.load().Show();//the original atomicA
atomicA.compare_exchange_strong(a2, A{2});// this makes no change
atomicA.load().Show();
atomicA.compare_exchange_strong(a1, A{2});//this changes atomicA
atomicA.load().Show();
}
请注意,并非所有 UDT 都能获得真正的原子行为(可能使用锁来实现)。要确保您的原子具有真实的原子行为,您可以使用 atomicA.is_lock_free()
.
我无法理解和编写与用户定义数据类型的以下原子库功能相关的代码:
std::atomic::compare_exchange_weak, std::atomic::compare_exchange_strong
bool compare_exchange_weak( T& expected, T desired,
std::memory_order success,
std::memory_order failure );
bool compare_exchange_strong( T& expected, T desired,
std::memory_order success,
std::memory_order failure );
所以,如果我有以下琐碎的 class,我如何在那个琐碎的 class 上使用 compare_exchange_weak / compare_exchange_strong 原子库方法?
class A
{
public:
void Show()
{
std::cout << "Called\n";
}
};
我不确定我们应该在方法中为用户定义的数据类型设置什么预期/期望值 - 例如 class A?
您的class没有数据,因此不需要使用std::atomic<A>
。如果你想知道如何使用std::atomic
和UDT,你可以添加一个成员数据然后使用下面的代码
#include <iostream>
#include <atomic>
class A
{
public:
int a;
void Show()
{
std::cout << a << "\n";
}
};
int main( ) {
A a1{1};
A a2{2};
std::atomic<A> atomicA{a1};
atomicA.load().Show();//the original atomicA
atomicA.compare_exchange_strong(a2, A{2});// this makes no change
atomicA.load().Show();
atomicA.compare_exchange_strong(a1, A{2});//this changes atomicA
atomicA.load().Show();
}
请注意,并非所有 UDT 都能获得真正的原子行为(可能使用锁来实现)。要确保您的原子具有真实的原子行为,您可以使用 atomicA.is_lock_free()
.