4

std::atomic_flag具有这些默认std::memory_orders 的 2 个函数:

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?也许我误解了这些是做什么的。

4

1 回答 1

4

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

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

于 2013-04-09T00:10:25.360 回答