我的意思是与 c++11 原子相比,例如:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0);
void incrementCounter() {
for (int i = 0; i < 1000; ++i) {
counter.fetch_add(1, std::memory_order_relaxed);
}
}
int main() {
std::thread t1(incrementCounter);
std::thread t2(incrementCounter);
t1.join();
t2.join();
std::cout << "Final counter value: " << counter << std::endl;
return 0;
}
在std::atomic的使用中,我们需要传递内存顺序参数。为什么 std::mutex 没有这个参数以及 std::mutex 的默认内存顺序是什么?
正确使用互斥体可以为无数据竞争程序提供顺序一致性(如果它们不使用任何弱于
seq_cst
的原子),即使互斥体锁定/解锁本身只是获取和释放操作。
(这就是那些无锁原子内存顺序的名称的来源。)
所以没必要让它们变得更强。
正如 Igor 指出的那样,如果比release和acquire更弱,它们将毫无用处:relaxed不会给出任何排序。对其他变量的操作,因此不会将它们包含到关键部分。
std::memory_order_consume
而不是 acquire
将不可用,因为您无法读取互斥量值以将其用作稍后加载的地址计算的一部分。 (如果你想搞乱以这种方式设计的锁来看看它是否可行,你必须使用 std::atomic
自己滚动它,但当前的编译器将 consume
提升为 relaxed
因为它目前已被弃用:原始版本事实证明,设计太难正确+高效地实现,并且与 std::kill_dependency 等一起使用也太麻烦)