为什么atomic_flag.clear()有一个次优的默认memory_order参数
Why does atomic_flag.clear() have a sub-optimal default memory_order argument?
std::atomic_flag
与这些默认的std::memory_order
有两个功能:
void clear(std::memory_order order = std::memory_order_seq_cst);
bool test_and_set(std::memory_order order = std::memory_order_seq_cst);
也许我错了,但不应该clear
总是是memory_order_release
和test_and_set
总是是memory_order_acquire
?也许我误解了它们的作用
c++11中所有原子操作的默认内存顺序是顺序一致性(std::memory_order_seq_cst
)。如果你愿意,你可以指定一个更宽松的内存顺序,尽管这通常更复杂。
std::atomic_flag
保证是无锁的,可以用来构建其他同步方法。而std::atomic<T>
类型可以用锁实现,如果编译器/库编写者选择这样做,并且仍然符合规范。这就是std::atomic_flag
存在这些默认值的原因。根据你想做的事情,指定一个不同的内存顺序可能是有意义的,但默认设置为保守正确的顺序一致性。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- 具有默认模板类型的默认构造函数的类型推导
- 当给定默认值时,为什么此模板参数推导失败
- 修改 VS Code 中的默认C++代码段
- 声明默认的模板化函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何使用非默认构造函数实例化模板化类
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 格式化浮点值:返回默认值
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr