Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 为什么是c++;11记忆的顺序放松仍然导致顺序等待?_Multithreading_C++11_Concurrency_Load_Atomic - Fatal编程技术网

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