为什么c++ 11 CAS操作使用两个指针形参
Why do C++11 CAS operations take two pointer parameters?
许多c++ 11 CAS操作(例如,atomic_compare_exchange_weak
, atomic_compare_exchange_strong
)接受两个指针和一个值,即:
bool atomic_compare_exchange(T* pointer, T* expected, // pseudodeclaration!
T desired);
相比之下,来自Microsoft、gcc和Intel的CAS操作都使用一个指针和两个值:
long InterlockedCompareExchange(long* pointer, long desired, // Microsoft
long expected);
int __sync_bool_compare_and_swap (T* pointer, T expected, // gcc and
T desired); // Intel
为什么c++ 11 CAS函数接受两个指针和一个值,而不是看起来更传统的一个指针和两个值?
c++ 11的方式更有用:如果交换失败,则*expected
被更新为新的当前值。这使得在循环中使用该函数变得很容易:
T value = x.load();
T newvalue = frob(value);
while (!atomic_compare_exchange(&x, &value, newvalue))
{
newvalue = frob(value);
}
使用Microsoft签名,测试操作是否成功更麻烦,对于GCC的__sync_type
版本也是如此。使用GCC的__sync_bool
,您甚至需要在每次交换失败时执行另一次加载。
我不明白为什么你不能两者兼得。在我的用例中,c++版本没有那么有用。我想等到一个变量有了值,然后我想把它设为一个新值。
带有GCC的参数:
while (!__sync_bool_compare_and_swap(&value, expected, desired)) { }
与c++ 11: auto tmp = expected;
while (!value.compare_exchange_weak(tmp,desired))
{
tmp = expected;
}
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- C / SFML:使用两个递归调用在屏幕上打印凸形形状仅显示第一个递归调用中的形状,而不是第二个
- 更换两个c形管柱
- 使用mem_fun_ref if成员函数需要多个形参
- c++函数中理论上可以作为形参传递多少个实参
- 为什么c++ 11 CAS操作使用两个指针形参
- 在c++的形参中传递多个参数而不使用va_list
- 使用 std::enable_if 作为 templ 时的默认模板参数.参数:为什么可以使用两个仅在enable_if参