C++マルチスレッド一巡り読書会vol.11
開催日時
2021年10月20日(水) 19:30~21:00
開催URL
https://cpp-osaka.connpass.com/event/227237/
参加人数
6人
読み進め方
本読み
【条件変数(Condition Variable)】
condition_variableは低オーバーヘッドで使える!
【基本の待機/通知処理】
ラムダ式はどのタイミングで呼ばれる?
notify_all()したタイミングでかな
(追記)「関数呼び出し時にまず1回+notify_xxxでスレッドが起きたとき」
コードで書くと ラムダ(pred)は以下の形で使われる
while (!pred()) { wait(lock); }
std::exchangeみたいな関数あるんですね
atomicのexchangeに着想を得て汎用に使えるようにした(C++14から)
1行にすることで例外が出たりしないので安全
【効率的な待機/通知処理】
conditionを分ける利点あるのかな?
cond_valを使うのは割と複雑なケース
いくつか処理がつながったときとか
条件変数1つだけみたいな状況はあまりない
適当に使っても早くならない
最後の!がよくわからない
2つのスレッドで同時にtake()を呼び出すと、片方しか復帰せずもう片方は永遠に待ち続ける
(追記)このリンク先の表がわかりやすい
https://yohhoy.hatenadiary.jp/entry/20140930/p1
【停止トークン対応[C++20]】
exchangeしているのはnotify_oneの後で問題ないの?
ロック自体はローカル変数lkのデストラクタまで有効
notify_oneせずに例外が出たら困るので基本的に直前にする
shared_ptrのカウントが0になったときにstop_tokenとかは使う
【タイムアウトサポート】
wait_for便利
戻り値のenumでタイムアウトか判別可能
wait_untilの指定時刻はC++20で月末まで待つ処理とかが可能
https://cpprefjp.github.io/reference/chrono/last_spec.html
【その他の提供機能】
基本的に何かに強いられているひとたち向けの関数
今日はここまで
次回は7章セマフォから
お悩み雑談室
C++の情報はどう集めてる?
https://www.reddit.com/r/cpp/
https://www.youtube.com/channel/UCxHAlbZQNFU2LgEtiqd2Maw
https://cppcon.org/
セッションごとに分かれてる(セキュリティ、など)
日本語だと基本なくてC++ MIXが最後の砦か
https://cppmix.connpass.com/
#C++マルチスレッド一巡り