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: 上記のコードで、ptr を設定するスレッドが実行を終了した場合でも、fun2 が 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 がアトミック i の値を 1 と見なすことは可能ですか、それとも値 2 と見なされることが保証されていますか?