継続的な最適化:CppMem による緩和されたセマンティック

セマンティックが緩和されているため、アトミック操作に対する同期や順序付けの制約はありません。

リラックス セマンティック

緩和されたセマンティックでは、アトミック操作のアトミック性のみが残ります。

06
15

さて、質問は非常に簡単に答えられます。プログラムの動作は明確に定義されていますか? x と y の可能な値はどれですか?一方で、x と y に対するすべての操作はアトミックです。そのため、プログラムは適切に定義されています。一方、スレッドのインターリーブには制限がありません。最終的に、スレッド 2 はスレッド 1 の操作を別の順序で見ることができます。したがって、進行中の最適化のプロセスで、スレッド 2 が x ==0 および y ==1 を表示できるのはこれが初めてです。x と y のすべての組み合わせが可能です。

x ==0 と y ==1 の場合、CppMem のグラフはどのように見えるでしょうか?

CppMem

23

それが CppMem プログラムでした。グラフに移ります。

(y=0,x=2000) の実行

グラフは、非直感的な動作を非常に明確に示しています。

x は書き込みスレッドから値 2000 を読み取りますが、y はメイン スレッドから値 0 を読み取ります。 y の読み取りは x の読み取りの前に順序付けられますが、どうなりますか。操作 e:Rrix を正確な意味の前に並べる sb sequenced-before オペレーション f:Rrix .

次は?

これは、進行中の最適化に関するミニ シリーズの最後の投稿です。それで、次は何ですか?シングルトン パターンには多くの問題があります。私はそれを完全に認識しています。しかし、シングルトン パターンは、スレッド セーフな方法で初期化する必要がある変数の理想的な使用例です。その時点から、同期せずに使用できます。
次の投稿では、マルチスレッド環境でシングルトンを初期化するさまざまな方法について説明します。パフォーマンスの数値を取得し、スレッドセーフな変数の初期化のユース ケースについて推論できます。