第14章.スレッド同期テクノロジー2


第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