为什么c++11的std::mutex没有内存顺序?

问题描述 投票:0回答:1

我的意思是与 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 的默认内存顺序是什么?

c++ mutex atomic memory-barriers stdmutex
1个回答
0
投票

正确使用互斥体可以为无数据竞争程序提供顺序一致性(如果它们不使用任何弱于

seq_cst
的原子),即使互斥体锁定/解锁本身只是获取和释放操作。 (这就是那些无锁原子内存顺序的名称的来源。)

所以没必要让它们变得更强。

正如 Igor 指出的那样,如果比release和acquire更弱,它们将毫无用处:relaxed不会给出任何排序。对其他变量的操作,因此不会将它们包含到关键部分。

std::memory_order_consume
而不是
acquire
将不可用,因为您无法读取互斥量值以将其用作稍后加载的地址计算的一部分。 (如果你想搞乱以这种方式设计的锁来看看它是否可行,你必须使用
std::atomic
自己滚动它,但当前的编译器将
consume
提升为
relaxed
因为它目前已被弃用:原始版本事实证明,设计太难正确+高效地实现,并且与 std::kill_dependency 等一起使用也太麻烦)

© www.soinside.com 2019 - 2024. All rights reserved.