C++マルチスレッド一巡り読書会vol.15
開催日時
2021年12月22日(水) 19:30~21:00
開催URL
参加人数
2人
【ラッチ(Latch)同期[C++20]】
「セマフォでは非負数になるまで待機」
これだと0を含んでいるが、セマフォでは0は含まないので非負整数と言いたかった疑惑アリ(そうなの?)
セマフォは0になったら待機して、加算されたら待機解除
ラッチ同期では減算操作のみの提供
countingではなくcount down
【基本のラッチ同期[C++20]】
ラッチを共有して複数の依存関係のあるタスクをスケジュールするのに使う
【同期ポイント[C++20]】
1つの同期ポイントが2スレッドに現れる場合のコード例
2回arrive_and_wait()が呼ばれたらすべてのロックが解除される
【待機試行[C++20]】
try_○○系の関数(ノンブロッキング)
"Spurious Failure"も今までと同じ話
【バリア(Barrier)同期[C++20]】
バリアの話
Fork-joinモデル
FanIn-FanOutともいう
【基本のバリア同期[C++20]】
同期ポイントは5つある(for文を自分で展開するとわかりやすい)
3つのスレッドがtask-1をすべて実行した後にtask-2、task-3、…と続けて実行する
バリアは1回きりではなく、waitしたら何度でも使える
テストをかける処理がこんな感じになる
各項目のタスクが完了したら結果を収集して次のテストへ
バリアフェーズ完了したときに任意の関数を呼び出せる
osyncstream
非同期出力に対応したstreamラッパ
coutをロックするので重い
できるなら自分で制御した方がよい
【その他の提供機能[C++20]】
バリアを使うときはたいていarrive_and_wait()を使っていて、その他の提供機能で出てくる関数は使わない
そうでなければラッチを使ってる
【CallOnce】
DCLはJavaだと割と普通(C++ではアンチパターンとか呼ばれてたけど)
【static変数初期化】
(-fno-threadsafe-staticsオプションを進んで付けたい人っているの・・・?)
【call_once関数】
mutexヘッダに入ってるんだ
call_once()にはmutexが使われてるので
once_flagはmoveもコピーもできない
【CallOnceとC++例外】
次回はアトミック変数から
お悩み雑談室
RustからC++を呼び出すFFIがうまくいかない・・・