次のコードがあるとしましょう。
void* p0 = nullptr;
void* p1 = alloc_some_data();
void f1() {
p0 = p1;
p1 = nullptr;
}
スレッド1で実行されていると仮定f1
します(コードをそのままにして)別のスレッドが、ある時点で(p0
コンパイラまたはハードウェアが最初の割り当ての前に2番目の割り当てなどの命令を並べ替える場合)と見なす可能性はありますか?p1
nullptr
これを尋ねる理由は、ガベージコレクターを実装し、アトミック命令()を使用してGCスレッドからポインターにアクセスする必要があるかどうかを知りたいためですstd::atomic
。GCスレッドが認識していれば問題はありませんが、GCスレッドが認識していればp0 == p1 == alloc_some_data()
問題が発生p0 == p1 == nullptr
します。これは、明らかに到達可能である場合、p1で以前のデータが到達不能として報告されるためです。