C++マルチスレッド一巡り読書会vol.16
開催日時
2022年1月12日(水) 19:30~21:00
開催URL
参加人数
3人
【アトミック変数(Atomic Variable)】
アトミック使ってます?
listやvectorに値を突っ込む場合はatomicが使えずMutexを使ってしまうことが多い
【アトミック操作可能な型】
Tに構造体は入れられるのか?
intやcharをメンバに持つ単純な構造体Hogeのstd::atomic<Hoge>だとコンパイルは通った
std::atomic<std::vector<Hoge>> はさすがにダメだった
「バイトコピー(memcpy)可能な型」であればTとして扱えるので単純な構造体は扱える?(意味があるかは置いておいて)
C++20からスマートポインタにも対応
あくまで参照カウンタ操作についてアトミック対応であり、その先のデータアクセスは従来通り
ポインタ型についても同様のことが言えそう
【Read/Write操作】
C++17までデフォルトコンストラクタが未初期化になることに注意
覚悟がないのでメモリオーダーの指定はいつもデフォルトです…
【RMW(Read-Modify-Write)操作】
「メンバ関数は変更前の値を返すという点が異なります」とあるけれど、前置の++と--演算子だけは変更後の値を返している(従来と同じ挙動に合わせるためと思われる)
【CAS(Compare-And-Swap)操作】
this_thread::yieldについて
現在の値とexpected(第1引数)が等値だった場合
現在の値をdesired(第2引数)で置き換え
trueをreturnする
等価でない場合
expected(第1引数)を現在の値で置き換え
falseをreturnする
いまいち等価でない場合にexpectedを現在の値に置き換える理由がわからないけれど、何かしら利点があるんだろうね
次回は1/26に【待機/通知処理[C++20]】から
お悩み雑談室
---------------
(一人居残り)
compare_exchange_weakのexpectedを現在の値に置き換える理由というか利点
今回の例だとロック中のlocked_は常に1だけれど、仮にlock()の引数にint nを追加してdesiredにnを指定するとロック中のlocked_はnになる
compare_exchange_weakに失敗した場合、expectedにnが入るためどこから呼び出したロックかをnから判別できるようになる
expectedがinout引数になっているのが考えにくさを増長させてる気がする