リソースへのアクセスを同期するには、待機関数のいずれかで 同期オブジェクトのいずれかを使用します。 同期オブジェクトの状態は、シグナル状態または非シグナル状態のいずれかです。 待機関数を使用すると、指定された非シグナル状態のオブジェクトがシグナル状態に設定されるまで、スレッドは自身の実行を停止できます。 詳細については、「 プロセス間同期」を参照してください。
適切な同期プリミティブの選択
| プリミティブ | Scope | Performance | リエントラント | いつ使用するか |
|---|---|---|---|---|
| スリム リーダー/ライター (SRW) ロック機構 | 1 つのプロセス | 高速(通常はユーザー モードで動作し、競合時にはカーネル モードに入ることがあります) | いいえ | モダン コードでのリーダー負荷の高いワークロードの既定の選択肢。 最小メモリ 占有領域 (ポインター サイズ)。 |
| 重要なセクション | 1 つのプロセス | 速い(スピン後にカーネル待機) | はい | 1つのプロセス内で、再入可能なロックまたは再帰的ロックが必要な場合に使用します。 SRW より少し大きい。 |
| ミュー テックス | クロスプロセス (名前付き) | 遅い (常にカーネル オブジェクト) | はい | 名前付きミューテックスを介したプロセス間の同期に必要です。
WaitForMultipleObjectsでも便利です。 |
| セマフォ | クロスプロセス (名前付き) | カーネルオブジェクト | N/A | リソース プールへの同時アクセスを制限します (たとえば、N 個の項目の接続プール)。 |
| イベント | クロスプロセス (名前付き) | カーネルオブジェクト | N/A | スレッド間/プロセス間のシグナリング。 データを保護する目的ではなく、"何かが発生しました" 通知に使用します。 |
C++ std::mutex / std::shared_mutex |
1 つのプロセス | 実装定義 | いいえ | 移植可能な C++ コードと RAII に適しています。 Win32 待機 API またはクロスプロセス同期が必要ない場合に使用します。 |
Note
SRW ロックとクリティカル セクション: 再帰ロックを必要としない新しいコードの場合は、SRW ロック (AcquireSRWLockExclusive/AcquireSRWLockShared) を使用します。 これらはより小さく、高速であり、リーダー/ライターセマンティクスをサポートします。 重要なセクションは、同じスレッドによる再入 (再帰的) 取得が必要な場合に、引き続き適切です。
Important
一般的な間違い: クリティカル セクションまたは SRW ロックで十分な場合に、プロセス内同期にミューテックスを使用します。 ミューテックスは常にカーネル モードの遷移を伴い、1 つのプロセス内での高頻度操作では大幅に低速になります。
その他の同期メカニズムを次に示します。
- 重複する入力と出力
- 非同期プロシージャ呼び出し
- クリティカル セクション オブジェクト
- 条件変数
- スリムリーダー/ライターロック
- 1 回限りの初期化
- インタロックされた変数アクセス
- 連結された 1 つのリンクされたリスト
- タイマー キュー
- MemoryBarrier マクロ
同期の詳細については、「 同期とマルチプロセッサの問題」を参照してください。