我试图了解 memory_order_relaxed 的细节。我指的是这个链接:CPP 参考。
#include <future>
#include <atomic>
std::atomic<int*> ptr {nullptr};
void fun1(){
ptr.store(new int{0}, std::memory_order_relaxed);
}
void fun2(){
while(!ptr.load(std::memory_order_relaxed));
}
int main(){
std::async(std::launch::async, fun1);
std::async(std::launch::async, fun2);
}
问题 1:在上面的代码中,从技术上讲,fun2 是否有可能处于无限循环中,即使设置 ptr 的线程已经完成运行,它也会将 ptr 的值视为 nullptr?
如果假设,我将上面的代码更改为以下代码:
#include <future>
#include <atomic>
std::atomic<int> i {0};
std::atomic<int*> ptr {nullptr};
void fun1(){
i.store(1, std::memory_order_relaxed);
i.store(2, std::memory_order_relaxed);
ptr.store(new int{0}, std::memory_order_release);
}
void fun2(){
while(!ptr.load(std::memory_order_acquire));
int x = i.load(std::memory_order_relaxed);
}
int main(){
std::async(std::launch::async, fun1);
std::async(std::launch::async, fun2);
}
相关问题:在上面的代码中 fun2 是否有可能将 atomic i 的值视为 1 或者确定它会看到值 2?