SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
Effec%ve	
  Modern	
  C++	
  
Item	
  35:	
  
Prefer	
  task-­‐based	
  programming	
  to	
  
thread-­‐based.	
@keisukefukuda	
  
doAsyncWork()という関数を非同期実行したい	
  
	
  
ü Thread-­‐based	
  
	
  
ü Task-­‐based	
  
int	
  doAsyncWork();	
  
std::thread	
  t	
  (doAsyncWork);	
int	
  doAsyncWork();	
  
auto	
  fut	
  =	
  std::async(doAsyncWork);	
std::future<T>
std::asyncの利点	
一般的に、task-­‐basedな方法の方が優れている	
  
	
  
1.  doAsyncWork()の戻り値の取得(get()関数)	
  
2.  doAsyncWork()が例外を送出する場合	
  
•  threadだとstd::terminate()が呼ばれてプロセス死亡	
  
•  std::asyncではget()が同じ例外を再送出する	
  
3.  より抽象化されている	
  
抽象化されるべきthread-­‐basedモデルの詳細	
  
(1)	
  threadという用語 	
ConcurrentなC++において、threadという用語は
3つの意味を持ちうる	
  
	
  
1.  Hardware	
  thread	
  
	
  
実際に計算を実行するスレッド	
  
最近のマシンは、CPU	
  coreごとに複数のスレッド
をサポートする	
  
	
  =	
  Intel	
  x86	
  CPUでいうとHyperThreading	
  
抽象化されるべきthread-­‐basedモデルの詳細	
  
(1)	
  threadという用語 	
ConcurrentなC++において、threadという用語は
3つの意味を持ちうる	
  
	
  
2.  SoTware	
  thread	
  
•  OSによって、プロセッサ全体で管理されるスレッド(い
わゆる普通の意味でのスレッド)	
  
•  HW	
  threadに割り付けられて実行される	
  
•  HW	
  threadよりも多く作られることができる。IO遅延や
条件変数等によるアイドル時間を削減してスループッ
トを向上させる	
  
	
  
抽象化されるべきthread-­‐basedモデルの詳細	
  
(1)	
  threadという用語 	
ConcurrentなC++において、threadという用語は
3つの意味を持ちうる	
  
	
  
3.  std::thread	
  
•  SW	
  threadへのハンドラを保持する、C++でのオブジェ
クト。1つのSW	
  threadのハンドルを持つか、nullであ
る	
  
–  関数無しのデフォルトコンストラクタで初期化された場合	
  
–  std::moveでmoveされた	
  
–  joinもしくはdetachされた	
  
	
  
抽象化されるべきthread-­‐basedモデルの詳細	
  
(2)	
  SW	
  threadは有限資源 	
システムが提供できるSW	
  threadの数には制限があるので、不
足の場合は std::system_errorが送出される	
  
	
  
int	
  doAsyncWork()	
  noexcept;	
  
	
  
だとしても、	
  
	
  
std::thread	
  t(doAsyncWork);	
  
	
  
が例外を送出する可能性が常にある	
  
抽象化されるべきthread-­‐basedモデルの詳細	
  
(2)	
  SW	
  threadは有限資源 	
SW	
  threadが足りないときどうするか?(threadで頑張るなら)	
  
	
  
•  同じスレッド内で(逐次に)実行する	
  
ü スレッド間で負荷の不均衡が生じる可能性	
  
ü 当該のスレッドがGUIスレッドだとレスポンスに問題	
  
•  実行中のどれかのSW	
  threadが終わるのを待つ	
  
ü もし選ばれたthreadが doAsyncWork()の結果等に依存
していたらデッドロック	
  
抽象化されるべき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になる	
  
ü 同じコアでも、別スレッドに切り替わった後に戻ってくると、
キャッシュが汚染されている	
  
hYps://wiki.csiro.au/display/ASC/Understanding+the+CPU+Cache
抽象化されるべきthread-­‐basedモデルの詳細	
  
(2)	
  SW	
  threadは有限資源 	
oversubscrip%onが問題だと行っても、HW	
  threadとSW	
  threadの
適正な比率は不明:	
  
	
  
ü IO律速か、計算律速か	
  
ü コンテキストスイッチのコスト(CPUとOSによる)	
  
ü SW	
  threadがキャッシュをどれくらい有効に使っているか	
  
	
  
→	
  諸々の詳細、アーキテクチャ、マシンスペック、実装に依存	
  
	
  要するにわからん	
  
	
  
これらの問題を,アプリの実装で解決しようとするのではなく
て、他の誰かに押しつけよう!	
  
	
  
「他の誰か」	
  =	
  C++	
  standard	
  libraryの実装者	
  
	
  
ü std::async(asyncとは言ってない)	
  
によってSW	
  threadが実際に作られるかどうかは保証されてい
ない	
  
→ SW	
  threadの資源量の問題は何とかしてくれるんじゃない
の?	
  
ü 負荷の不均衡問題は解決できるとは限らないけど、プログラマ
よりランタイムライブラリ・スケジューラの方が情報を多く持って
る	
  
ü GUIスレッドの件は解決できないが、Item36	
  で扱う
std::launch::async	
  を使えば強制できる	
  
最新のスケジューラーは、thread	
  poolとwork	
  
stealingによってoversubscrip%onと負荷の不均衡
の問題を改善している	
  
(例:Intel	
  TBB)	
  
	
  
Thread	
  pooling:	
  
あらかじめ一定個のスレッドを常駐させておいて、タスク
をどれかのスレッドに割り当てる方式	
hYps://en.wikipedia.org/wiki/Thread_pool_paYern
最新のスケジューラーは、thread	
  poolとwork	
  
stealingによってoversubscrip%onと負荷の不均衡
の問題を改善している	
  
(例:Intel	
  TBB)	
  
	
  
Work	
  stealing:	
  
タスクからタスクが生成されるようなアプリケーションにおいて、
スレッドプールのスレッドごとにキューを持ち、自分のキューが
空になったら他のスレッドのキューからタスクを取ってくる	
  
最新のスケジューラーは、thread	
  poolとwork	
  
stealingによってoversubscrip%onと負荷の不均衡
の問題を改善している	
  
(例:Intel	
  TBB)	
  
	
  
実は、C++規格の一部が、thread	
  pool	
  のような実
装を採用することを難しくしている	
  
(thread_local	
  とか?)	
  
	
  
とはいえ、これからも技術の進展が期待できるの
で、std::async	
  を使って書いておけば、自動的
にその恩恵が受けられる!	
  
threadを直接扱う方が良い場合:	
•  下位レイヤのスレッド実装のAPIを呼び出す
必要がある場合	
  
•  threadの利用方法を、アプリケーションないで
最適にできる	
  &&	
  したい場合	
  
•  C++実装が、利用したいプラットフォーム上で
thread	
  pool等をサポートしておらず自分で書
く必要がある場合
Things	
  to	
  remember	
•  std::thread	
  は、非同期実行された関数の戻り値を取得す
る方法を提供せず、また例外が送出されればプログラム
が終了してしまう	
  
•  Thread-­‐based	
  プログラミングでは、SW	
  thread資源の枯渇、
oversubscrip%on、負荷の不均衡の問題に対して手動で対
策を取る必要がある	
  
•  Task-­‐basedプログラミングでデフォルトのlaunch	
  policyを使
えば、それらの問題の大半は自動的になんとかしてくれる

Mais conteúdo relacionado

Mais procurados

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 

Mais procurados (20)

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 

Semelhante a Effective Modern C++ 読書会 Item 35

CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
Computational Materials Science Initiative
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
gintenlabo
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
 

Semelhante a Effective Modern C++ 読書会 Item 35 (20)

Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Uart受信設計2013
Uart受信設計2013Uart受信設計2013
Uart受信設計2013
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
 
並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js並列対決 Elixir × Go × C# x Scala , Node.js
並列対決 Elixir × Go × C# x Scala , Node.js
 
Stream2の基本
Stream2の基本Stream2の基本
Stream2の基本
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
Clojure
ClojureClojure
Clojure
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 

Mais de Keisuke Fukuda (7)

秒速ChainerMN
秒速ChainerMN秒速ChainerMN
秒速ChainerMN
 
Supercomputing'18 概要紹介
Supercomputing'18 概要紹介Supercomputing'18 概要紹介
Supercomputing'18 概要紹介
 
深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?深層学習インフラ、借りるべきか?買うべきか?
深層学習インフラ、借りるべきか?買うべきか?
 
Clojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しようClojure座談会 #1 LT 独自コレクションを定義しよう
Clojure座談会 #1 LT 独自コレクションを定義しよう
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)
 

Effective Modern C++ 読書会 Item 35