3

我想知道您是否有 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));
}
4

1 回答 1

3

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

于 2013-08-06T06:18:25.893 回答