C++ 为什么atomic_flag.clear()有次优的默认内存顺序参数?

C++ 为什么atomic_flag.clear()有次优的默认内存顺序参数?,c++,multithreading,c++11,atomic,C++,Multithreading,C++11,Atomic,std::atomic_flag有两个函数,它们的默认顺序是std::memory_s: void clear(std::memory_order order = std::memory_order_seq_cst); bool test_and_set(std::memory_order order = std::memory_order_seq_cst); 也许我错了,但不应该清除总是内存顺序(u release和测试(u)和设置(u set)总是内存顺序(u acquire)?也许我误解

std::atomic_flag
有两个函数,它们的默认顺序是
std::memory_
s:

void clear(std::memory_order order = std::memory_order_seq_cst);
bool test_and_set(std::memory_order order = std::memory_order_seq_cst);

也许我错了,但不应该
清除
总是
内存顺序(u release
测试(u)和设置(u set)
总是
内存顺序(u acquire)
?也许我误解了它们的作用。

对于c++11中的所有原子操作,默认内存顺序是顺序一致性(
std::memory\u order\u seq\u cst
)。如果需要,可以指定一个更宽松的内存顺序,尽管这通常更复杂


std::atomic_标志
保证是无锁的,可以用于构建其他同步方法。而
std::atomic
类型可以通过锁来实现,只要编译器/库编写器选择并且仍然符合规范。这就是为什么
std::atomic_flag
存在这些默认值的原因。根据您试图执行的操作,指定不同的内存顺序可能是有意义的,但默认设置是保守正确的,顺序一致。

您误解了
内存顺序\u释放
内存顺序\u获取
的意思。它们是关于内存顺序,而不是锁定。(尽管定义内存顺序对于实现锁很重要。)请参阅
clear()
可以是
memory\u order\u release
,但是
test\u和\u set
永远不能是
memory\u order\u acquire
,因为它是一个读-修改-写操作,必须是
memory\u order\u acq\u release
。有一些体系结构,您可以使用
内存\u顺序\u seq\u cst
以外的其他方法获得较小的性能提升,但通常不值得。@WanderingLogic您只需要最小顺序(获取和释放)来实现锁。“但不应该总是清除内存\u顺序\u释放和测试\u和\u设置总是清除内存\u顺序\u获取吗?”不清楚您为什么会这样想。更强大的内存顺序不会有什么坏处(即使一些ppl声称这可能是由于错误的规范)。