Multithreading 为什么是c++;11记忆的顺序放松仍然导致顺序等待?
我希望原子负载不必等待赋值,但我有以下代码:Multithreading 为什么是c++;11记忆的顺序放松仍然导致顺序等待?,multithreading,c++11,concurrency,load,atomic,Multithreading,C++11,Concurrency,Load,Atomic,我希望原子负载不必等待赋值,但我有以下代码: #include <atomic> #include <chrono> #include <iostream> #include <thread> using namespace std; atomic<bool> y; void write() { this_thread::sleep_for(chrono::seconds(2)); cout<<"end sl
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
using namespace std;
atomic<bool> y;
void write()
{
this_thread::sleep_for(chrono::seconds(2));
cout<<"end sleep\n";
y.store(true,memory_order_relaxed);
}
void read()
{
while(!y.load(memory_order_relaxed));
cout<<"end load\n";
}
int main() {
y = false;
thread a(write);
thread b(read);
a.join();
b.join();
cout<<y.load()<<endl;
}
我运行了很多次,结果总是一样的
因此,在我看来,“read()”函数的“原子加载”将等待“write()”函数的“存储”完成。这是我的程序的问题,还是c++11内存顺序的设计
我在ubuntu18.04和g++上。谢谢。您的
read
函数有一个while
循环,该循环将重复,直到y.load()
读取的值为非零为止。因此,这将循环,直到1到y
的存储对该线程可见为止
在
main
中进行打印之前,对join
的调用将确保两个线程都已完成,因此,1到y
的存储也已在打印之前完成。您的代码的行为与它应该的完全一样。读线程旋转直到值变为真,这是在写线程中设置的。您是否期望y.load(内存\u顺序\u松弛)
展望未来,并以某种方式预测,两秒钟后,y
将变为true
?还不清楚您期望从您的示例中得到什么不同的结果。
end sleep
end load
1