第14章。スレッド同期テクノロジー2
1.シーケンスの同期を実行する
スレッドの実行順序を同期します.メモリにアクセスするスレッドの実行順序を同期します. 実行シーケンス同期は、メモリアクセス同期を含む概念である.生産者/消費者モデル
たとえば、入出力文字列の演算を考慮します.
入力が最初に発生し、出力される. 入力/出力は交互に行うべきである. スレッドが入力と出力を同時に担当している場合一度に入力データ量が既存データ量を超える場合、.
入力/出力は繰り返す必要がありますが、が1つのスレッドで出力されたとき、データが引き続き流入するとになる.
入力データが失われる可能性があります. これらの問題を解決するために、通常I/Oを設計する時「入力スレッド->Buffer->出力スレッド」形式で設計されています. は、常に入力>出力時にバッファのサイズを十分に設計する. データは、外部から入った場合にバッファに積み上げられる. バッファが受ける範囲では、出力が遅くてもデータが失われません. の場合、入力スレッドを生産者スレッド、と呼ぶ.
出力ねじを消費者ねじと呼ぶ. は、生産者/消費者モデルと呼ばれ、重要なのは順序である. 生産者の実行が完了した後、消費者は実行しなければならない.イベントベースの同期
イベントベースの同期を使用する問題
生産者Threedはデータをバッファにインポートします. 消費者Threedはこれらのデータを持って行った. 題:生産者スレッドがデータをすべてインポートしたかどうか、消費者スレッドは不明です. Windowsでの同期スレッドの実行順序といえば,まずイベントベースの同期技術が考えられる. の細い麻布やMutexのように、同期オブジェクトを使用します.は「アクティブオブジェクト」と呼ばれています. は、通常、スレッドまたはプロセス内のカーネルオブジェクトの初期状態が無信号状態である. とスレッドまたはプロセスが終了すると、カーネルオブジェクトは自動的に署名済みに変更されます. ただし、イベントオブジェクトは、スレッドまたはプロセスの終了時に自動的に信号状態に入ることはありません. 、すなわち、自動的に信号状態に入る特定の状況は存在しない.イベントベースのメカニズムの例
カーネルオブジェクト(イベント)を作成
カーネルオブジェクトを初期無信号状態に設定.
生産者スレッドが完了すると、消費者がアクセスする必要がある場合、生産者スレッドはこのカーネルオブジェクトの状態を無信号->信号状態に変更する.
消費者Threadは、このカーネルオブジェクトが署名済みになるのを見て、作業を開始します.に達するために、消費者ThreadはWaitForSingleObject()関数を使用して呼び出し、カーネルオブジェクトが信号状態に入るのをブロック状態で待つ. 生産者Threedが動作を完了すると、カーネルオブジェクトは信号状態になります.このとき呼び出された関数SetEvent()イベントベースの同期モードいべんとベースのどうきもーど:手動/自動リセットモードしゅどう/じどうリセットもーど
HANDLE CreateEvent (
LPSECURITY_ATTRIBUTES lpEventAttributes, // 보안 속성
BOOL bManualReset, // manual-reset mode 설정
BOOL bInitialState, // 이벤트의 초기 상태 설정
LPCTSTR lpName // 이벤트 오브젝트 이름 설정
);
/*
bManualReset
- True: 수동 리셋 모드 이벤트 오브젝트
- False: 자동 리셋 모드 이벤트 오브젝트
bInitialState
- True: Signaled 상태의 이벤트 오브젝트 생성
- False: Non-Signaled 상태의 이벤트 오브젝트 생성
*/
手動リセットモード
手動操作
イベントオブジェクト状態 Signaled -> Non-Signaled Non-Signaled -> Signaled 自動リセットモード
非信号->信号手動(SetEven)関数の生産者Thredだけが自分が完成するタイミングを知っているので、完了
日後にSetEvent()関数を呼び出す
信号->信号自動なし消費者スレッドはWaitForSingleObject()関数を呼び出し、ブロックモードでイベントオブジェクトが信号状態に入るのを待つ.
生産者スレッドはSetEvent()関数を呼び出し、イベントオブジェクトが信号となるとWaitForSingleObject()関数を返し、を返す.
イベントオブジェクト自動無信号 自動リフレッシュモード:、一瞬に1スレッドのみ実行
手動リフレッシュモード:複数のスレッドを同時に実行
3.タイマーベースの同期
Windowsでは、信号状態の概念が重要であるカーネルオブジェクトは、特定の場合に信号状態になります. カーネルオブジェクトは、明示的な関数呼び出しによって信号状態に入る. ここで説明する同期オブジェクトは、指定された時間後に自動的に信号状態に入る特性を有する. タイマに基づく同期スレッドは、臨界領域の問題を解決するための同期の観点とは異なる. ここでいう同期は、スレッドの実行時間と実行周期を決定することを意味する.
手動リフレッシュタイマ目覚まし時計を考えればいいです. の午前6時に目覚まし時計を設置すると、午前6時に時計が鳴ります. イベントは私が指定した時間内に署名されたになります.
サイクルタイマ手動リセットタイマの周期特性を有する形状.
午前6時に目覚まし時計を設置すると、30分ごとに繁殖周期に目覚まし時計を設置し、ウォルリムロックに設定する.
自動(周期)タイマが信号状態に入るタイマを自動リセットタイマと呼ぶ.
30分ごとに警報を発する=30分ごとに信号を発する.
Reference
Windowsシステムのプログラミングは脳を刺激する Blog