質問1:
RCU ロックを紹介する記事で、彼はパブリッシュ/サブスクライブ メカニズムを記述しています。しかし、rcu_assign_pointer()について質問があります。この記事で、彼は次のように述べています。
1 p->a = 1;
2 p->b = 2;
3 p->c = 3;
4 rcu_assign_pointer(gp, p);
rcu_assign_pointer() は新しい構造体を公開し、コンパイラと CPU の両方に、p によって参照されるフィールドへの割り当ての後に gp への割り当てを強制的に実行させます。
しかし、コンパイラと CPU はpが割り当てられたことをどのように知ることができますか?たとえば、p->a と p->b を初期化した場合、コンパイラと CPU は 2 つの状況をどのように区別するのでしょうか?
situation 1:
1 p->a = 1;
2 p->b = 2;
3 p->c = 3;
4 rcu_assign_pointer(gp, p);
situation 2:
1 p->a = 1;
2 p->b = 2;
3 rcu_assign_pointer(gp, p);
質問2:
読み取り側のクリティカル セクションについては、連続してデータを読み取るリーダーがいる場合、ライターはそれらを待つ必要がありますか、それともライターは同期操作を実行できませんでしたか? はいの場合、読者は常に古いバージョンを読みますか?