Mais conteúdo relacionado
Semelhante a Effective Modern C++ 読書会 Item 35 (20)
Mais de Keisuke Fukuda (7)
Effective Modern C++ 読書会 Item 35
- 1. Effec%ve
Modern
C++
Item
35:
Prefer
task-‐based
programming
to
thread-‐based.
@keisukefukuda
- 5. 抽象化されるべきthread-‐basedモデルの詳細
(1)
threadという用語
ConcurrentなC++において、threadという用語は
3つの意味を持ちうる
2. SoTware
thread
• OSによって、プロセッサ全体で管理されるスレッド(い
わゆる普通の意味でのスレッド)
• HW
threadに割り付けられて実行される
• HW
threadよりも多く作られることができる。IO遅延や
条件変数等によるアイドル時間を削減してスループッ
トを向上させる
- 6. 抽象化されるべきthread-‐basedモデルの詳細
(1)
threadという用語
ConcurrentなC++において、threadという用語は
3つの意味を持ちうる
3. std::thread
• SW
threadへのハンドラを保持する、C++でのオブジェ
クト。1つのSW
threadのハンドルを持つか、nullであ
る
– 関数無しのデフォルトコンストラクタで初期化された場合
– std::moveでmoveされた
– joinもしくはdetachされた
- 7. 抽象化されるべきthread-‐basedモデルの詳細
(2)
SW
threadは有限資源
システムが提供できるSW
threadの数には制限があるので、不
足の場合は std::system_errorが送出される
int
doAsyncWork()
noexcept;
だとしても、
std::thread
t(doAsyncWork);
が例外を送出する可能性が常にある
- 8. 抽象化されるべきthread-‐basedモデルの詳細
(2)
SW
threadは有限資源
SW
threadが足りないときどうするか?(threadで頑張るなら)
• 同じスレッド内で(逐次に)実行する
ü スレッド間で負荷の不均衡が生じる可能性
ü 当該のスレッドがGUIスレッドだとレスポンスに問題
• 実行中のどれかのSW
threadが終わるのを待つ
ü もし選ばれたthreadが doAsyncWork()の結果等に依存
していたらデッドロック
- 9. 抽象化されるべきthread-‐basedモデルの詳細
(2)
SW
threadは有限資源
SW
threadが足りるとしても、oversubscrip%on問題が
(HW
threadに対して
SW
threadが多すぎる)
ü OSのスケジューラは、%me
sliceで複数のSW
threadをHW
threadに割り付ける
ü スレッド切り替え(コンテキストスイッチ)はスレッド管理の
コストを増加させる
ü あるSW
threadが別コアに行ってしまうと、CPUキャッシュ
がcold
startになる
ü 同じコアでも、別スレッドに切り替わった後に戻ってくると、
キャッシュが汚染されている
- 11. 抽象化されるべきthread-‐basedモデルの詳細
(2)
SW
threadは有限資源
oversubscrip%onが問題だと行っても、HW
threadとSW
threadの
適正な比率は不明:
ü IO律速か、計算律速か
ü コンテキストスイッチのコスト(CPUとOSによる)
ü SW
threadがキャッシュをどれくらい有効に使っているか
→
諸々の詳細、アーキテクチャ、マシンスペック、実装に依存
要するにわからん
- 12. これらの問題を,アプリの実装で解決しようとするのではなく
て、他の誰かに押しつけよう!
「他の誰か」
=
C++
standard
libraryの実装者
ü std::async(asyncとは言ってない)
によってSW
threadが実際に作られるかどうかは保証されてい
ない
→ SW
threadの資源量の問題は何とかしてくれるんじゃない
の?
ü 負荷の不均衡問題は解決できるとは限らないけど、プログラマ
よりランタイムライブラリ・スケジューラの方が情報を多く持って
る
ü GUIスレッドの件は解決できないが、Item36
で扱う
std::launch::async
を使えば強制できる
- 17. Things
to
remember
• std::thread
は、非同期実行された関数の戻り値を取得す
る方法を提供せず、また例外が送出されればプログラム
が終了してしまう
• Thread-‐based
プログラミングでは、SW
thread資源の枯渇、
oversubscrip%on、負荷の不均衡の問題に対して手動で対
策を取る必要がある
• Task-‐basedプログラミングでデフォルトのlaunch
policyを使
えば、それらの問題の大半は自動的になんとかしてくれる