std::exchange 是专门用于原子的吗?
Is std::exchange specialized for atomics?
std::exchange(x,y)
将值 y
分配给 x
,将 x
的旧值分配给 returns。
此函数是否专门用于原子值,即它会使用 std::atomic_exchange
吗?
我在想答案是否定的,那么为什么不呢?有没有考虑过?我觉得是个好主意。
我正在使用它来重置一个简单的计数器,我只是想知道我是否在将来某个时候使计数器原子化以支持线程,它是否会正常工作还是不安全。
我如何编写泛型函数,它对原子类型使用原子交换,对普通类型使用普通交换?
How can I write generic function where it will use atomic exchange for
atomic types and ordinary exchange for ordinary types?
可以通过检测obj.exchange(x)
是否为有效表达式(对std::atomic
有效)来判断是使用成员函数exchange
还是自由函数std::exchange
。
#include <utility>
template<class T, class U = T>
constexpr
T my_exchange(T& obj, U&& new_value) {
if constexpr (requires { obj.exchange(std::forward<U>(new_value)); })
return obj.exchange(std::forward<U>(new_value));
else
return std::exchange(obj, std::forward<U>(new_value));
}
std::exchange(x,y)
将值 y
分配给 x
,将 x
的旧值分配给 returns。
此函数是否专门用于原子值,即它会使用 std::atomic_exchange
吗?
我在想答案是否定的,那么为什么不呢?有没有考虑过?我觉得是个好主意。
我正在使用它来重置一个简单的计数器,我只是想知道我是否在将来某个时候使计数器原子化以支持线程,它是否会正常工作还是不安全。
我如何编写泛型函数,它对原子类型使用原子交换,对普通类型使用普通交换?
How can I write generic function where it will use atomic exchange for atomic types and ordinary exchange for ordinary types?
可以通过检测obj.exchange(x)
是否为有效表达式(对std::atomic
有效)来判断是使用成员函数exchange
还是自由函数std::exchange
。
#include <utility>
template<class T, class U = T>
constexpr
T my_exchange(T& obj, U&& new_value) {
if constexpr (requires { obj.exchange(std::forward<U>(new_value)); })
return obj.exchange(std::forward<U>(new_value));
else
return std::exchange(obj, std::forward<U>(new_value));
}