C++11 多线程是否可以使用内存\顺序\使用std::atomic获取将加载与单个存储同步

C++11 多线程是否可以使用内存\顺序\使用std::atomic获取将加载与单个存储同步,c++11,atomic,C++11,Atomic,我想知道是否有两个线程正在使用内存\u顺序\u获取进行加载,一个线程正在使用内存\u获取\u释放进行存储,加载是否只与两个线程中的一个进行加载同步?这意味着它只能与存储/加载的一个线程同步,或者可以让多个线程执行同步加载,而单个线程执行存储。在研究了一对一的关系后,情况似乎是这样,但读-修改-写操作似乎是连锁的,见下文 如果线程正在执行读-修改-写操作(如fetch\u-sub),那么它似乎可以正常工作,即使reader1\u线程和reader2\u线程之间没有同步关系,这些线程也会有一个链式释

我想知道是否有两个线程正在使用内存\u顺序\u获取进行加载,一个线程正在使用内存\u获取\u释放进行存储,加载是否只与两个线程中的一个进行加载同步?这意味着它只能与存储/加载的一个线程同步,或者可以让多个线程执行同步加载,而单个线程执行存储。在研究了一对一的关系后,情况似乎是这样,但读-修改-写操作似乎是连锁的,见下文

如果线程正在执行读-修改-写操作(如fetch\u-sub),那么它似乎可以正常工作,即使reader1\u线程和reader2\u线程之间没有同步关系,这些线程也会有一个链式释放

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));
}
std::原子s;
void loader_thread()
{
s、 存储(1,标准::内存\订单\发布);
}
//如果这些是fetch_sub而不是load,则链似乎正确,
//想知道是否会同步两个线程的加载
//将与加载程序线程中的存储同步,或仅与第一个线程同步
无效读取器1_线程()
{
而(!s.load(std::memory_order_acquire));
}
无效读取器2_线程()
{
而(!s.load(std::memory_order_acquire));
}
该标准规定“原子存储释放与从存储中获取其值的加载获取同步”(C++11§1.10[intro.multithread]p8)。它并没有说只有一个这样的同步负载;因此,实际上,任何从原子存储释放中获取其值的原子负载获取都与该存储同步