gpt4 book ai didi

c++11 - 多个线程是否可以使用 std::atomic 使用 memory_order_acquire 将负载与单个存储同步

转载 作者:行者123 更新时间:2023-12-02 00:06:38 26 4
gpt4 key购买 nike

我想知道如果您有 2 个线程使用 memory_order_acquire 进行加载,一个线程使用 memory_acquire_release 进行存储,加载是否只会与两个执行加载的线程之一同步?意思是它只能与存储/加载的线程之一同步,或者您可以让多个线程执行同步加载,而单个线程执行存储。在研究它是一对一的关系之后,情况似乎是这样,但读取-修改-写入操作似乎是链式的,请参见下文。

如果线程正在执行像 fetch_sub 这样的读-修改-写操作,那么它似乎工作正常,那么即使 reader1_thread 和 reader2_thread 之间没有同步关系,它们似乎也会有一个链式释放

std::atomic<int> s;

void loader_thread()
{
s.store(1,std::memory_order_release);
}

// seems to chain properly if these were fetch_sub instead of load,
// wondering if just loads will be synchronized as well meaning both threads
// will be synched up with the store in the loader thread or just the first one

void reader1_thread()
{
while(!s.load(std::memory_order_acquire));
}

void reader2_thread()
{
while(!s.load(std::memory_order_acquire));
}

最佳答案

该标准表示“原子存储释放与从存储中获取其值的加载获取同步”(C++11 §1.10 [intro.multithread] p8)。值得注意的是,没有说只能有一个这样的同步负载;所以确实 任何 从原子存储释放中获取其值的原子加载获取与该存储同步。

关于c++11 - 多个线程是否可以使用 std::atomic 使用 memory_order_acquire 将负载与单个存储同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com