为什么atomic_flag.clear()有一个次优的默认memory_order参数?

时间:2013-04-08 23:42:38

标签: c++ multithreading c++11 atomic

std::atomic_flag有2个函数,默认std::memory_order 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);

也许我错了,但不应该clear 总是 memory_order_releasetest_and_set 总是 {{1 }}?也许我误解了这些做法。

1 个答案:

答案 0 :(得分:4)

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

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