イベントと条件変数

公開:2011-09-12 08:01
更新:2020-02-15 04:36
カテゴリ:c++,boost,dawもどきの作成,windows,audio

メインスレッドからファイル読み込みスレッドとWASAPI出力スレッドを起動するようにした。単純にスレッドを起動しただけで中身は実装し始めたところだ。

ソースコード

メインスレッドから起動したスレッドは初期化したらすぐに休眠し、メインスレッドから指示がきたら仕事を行い終わったらまた休眠する。

例えばファイル読み込みスレッドはメインスレッドからファイルオープンの指示が来るまでは休眠し、指示が来ると起きてファイルオープンし、休眠する。ファイル読み込みの指示がきたら起きてファイルを随時読み込みバッファに格納し、終了したらまた休眠する。

こういうことをしたい時にどうするか。イベントとアトミック変数の組み合わせでいいのではないか。例えばファイル読み込みスレッドはメインスレッドからの指示が来るまではWaitForSingleObjectでイベントが来るのを待つ。メインスレッドはアトミック変数を変更しイベントをファイル読み込みスレッドに対して送る。イベントを受け取るとファイル読み込みスレッドは活動状態となりアトミック変数を参照してしかるべき処理を行い、終了するとまた休眠状態となる。処理の完了を何らかの方法でメインスレッドに送る必要があるかもしれない。

そんな感じでイベントオブジェクトとboost::atomicで実装し始めたのだが、「東方算程譚」ブログの「ランデブー」に条件変数のことが書いてあった。

XPの頃までWindowsAPIになかった 条件変数:Condition-VariableがVista以降サポートされて、 スレッドの同期が楽になりました。

つかWindowsAPIをハダカで使うよか、Boost.ThreadやTBBに任せるが吉なんだけども。

条件変数はいままでよく知らなかったので調べている途中。