Synchronization」の日本語参考訳です。はじめに同期処理はオーバーヘッドを伴うため、マルチスレッド・プログラムのパフォーマンスを妨げる恐れがあります。使用することで、同期を軽減し、プログラムの実行速度を向上できます。プラットフォーム向けにマルチスレッド・アプリケーションを効率的に開発するための手法について説明します。つのスレッドが書き込みを行う場合、共有データの整合性を保つために、スレッド間で同期が必要になることがあります。このような場合、スレッドがロックを取得してから共有データ構造への読み取り/書き込みを行い、終了後にロックを解放することで処理を同期する方法が一般的です。どのようなロック手法でも、ロックしたデータ構造を保護するにはオーバーヘッドが伴います。アトミック命令を使用するため、現在のプロセッサーでは速度の低下を招きます。同期コード内では並列実行が制限され、シリアル実行によるボトルネックが発生するため、同期はプログラムの実行速度も低下させます。このため、コード内のタイム・クリティカルなセクションで同期を行うと、コードのパフォーマンスは大幅に損なわれます。使用することで、マルチスレッド化されたタイム・クリティカルなコードセクションから同期を排除することができます。これは、共有データへのリアルタイムのアクセス順序が重要ではない場合のみ可能です。アクセス順序が重要な場合でも、実行頻度の低い、タイム・クリティカルではないセクションへ順序設定を安全に移動することができれば、同期を排除することができます。複数のスレッドで発生するイベントをカウントする変数について考えてみましょう。使用して、以下のようなプログラムを作成することができます。つのスレッドだけであることを保証するために同期を行う必要があります。そのため、すべてのイベントで同期が行われます。この同期を排除することで、プログラムの実行速度を向上できます。一例として、以下のように、並列領域内で各スレッドにイベントの発生回数をカウントさせ、後でそれぞれのカウントを集計します。使用して、それぞれのカウントを格納しています。最初の並列領域ですべてのローカルイベントをカウントし、次の領域でそれらを集計して合計を算出します。このソリューションでは、イベントごとに同期を行う代わりに、スレッドごとに同期を行っています。そのため、スレッド数よりもイベントの発生回数が多いほど、パフォーマンスが向上します。このプログラムでは、どちらの並列領域のスレッド数も同じであると仮定しています。つのメリットは、プロセッサーのデータキャッシュが共有されていない場合に、共有データよりもプロセッサーのキャッシュにデータが長く保持されることです。つのプロセッサーがそのアドレスに書き込みを行うと、それ以外のすべてのプロセッサーのキャッシュではそのアドレスが無効となり、メモリーから再度取り出す必要があります。プロセッサーによってのみ書き込みが行われ、別のプロセッサーによって書き込みが行われることがないため、プロセッサーのキャッシュに長くとどまりやすくなります。スレッド・ローカル・データの使用方法を示した一例です。同様の効果を得るためには、スレッド・ローカル・データ用のキーを作成し、そのキーを使用してデータにアクセスする必要があります。スレッドでも同様です。割り当て、そのインデックスを使用して、スレッドローカルな値を設定します。節で指定することで、スレッドローカル変数を作成することもできます。これらの変数は、並列領域の最後に自動で割り当てが解除されます。別の方法として、スレッド化モデルに関係なく、与えられたスコープ内のスタックで割り当てられた変数を使用して、スレッド・ローカル・データを指定することも可能です。この場合、スコープの最後で変数の割り当てが解除されます。アドバイスこのスレッド・ローカル・ストレージの手法は、タイム・クリティカルなコードセクションで同期が行われ、同期される処理がリアルタイムでの順序設定を必要としない場合に適しています。処理の実行順序が重要な場合でも、タイム・クリティカルなセクションで十分な情報を収集でき、後でタイム・クリティカルではないコードセクションで順序設定を再現できる場合は、この手法を使用することができます。スレッドが共有バッファーへ書き込みを行う次の例について考えてみましょう。値が一定に増加する変数であると仮定します。ソートされたバッファーデータをファイルに書き込みます。ルーチン内の同期を排除することができます。内のクリティカル・セクションが排除されます。値に従って、タイム・クリティカルではないコードセクションで結合することができます。利用ガイドこの手法を利用する場合は、トレードオフに注意する必要があります。この手法は、同期をタイム・クリティカルなコードセクションからタイム・クリティカルではないコードセクションに移動するものであって、同期の必要性を排除するものではありません。以下の手順でスレッド・ローカル・ストレージの実装を検討してください。最初に、同期によって該当コード部分で実際に速度低下が発生しているかどうかを検証します。パフォーマンス・アナライザーを使用して、各コードセクションのパフォーマンス問題を確認できます。次に、プログラムの処理の実行順序が重要であるかどうかを検証します。重要ではない場合は、前述のイベント回数をカウントする例のように、同期を排除できます。重要な場合は、順序設定を後のタイム・クリティカルではないコードセクションで正しく実行できるかどうか検証します。最後に、同期を別のコードセクションに移動することで、移動先のコードセクションで同様のパフォーマンス問題が生じないことを確認します。して、前述のイベント回数をカウントする例のように、変更後に同期の回数が大幅に軽減されるかどうか見てみると良いでしょう。