SlideShare uma empresa Scribd logo
1 de 12
Baixar para ler offline
Effective Modern C++
勉強会#8 Item 38
星野 喬(@starpoz)
サイボウズ・ラボ
2015-08-19
1
Item 38
Be aware of varying thread
handle destructor behavior.
2
Thread handles
• ここでは std::thread と std::future,
std::shared_future のこと
• std::future と std::shared_future はこの資料で
は合わせて future と呼ぶことにする
3
std::thread destructor
• joinable である場合、std::terminate が呼ばれ
てプロセス停止
• implicit join/detach を避けた(Item 37 参照)
4
future の destructor
• 時には implicit join のように振る舞う
• 時には implicit detach のように振る舞う
• 時には何もしないように振る舞う
• 何故???
5
callee 結果の保存場所
• callee (promise)でも caller (future) 側でもない
• callee 側は先に destructor 呼ばれるケースあり
• caller 側は future が移動/共有されるケースあり
• future から参照され、参照カウントで管理され
る shared state に結果が書かれる
6
future destructor の振る舞い
• 条件A: std::async 由来の shared state を参照
• 条件B: ポリシが std::launch::async
• 条件C: 自分が shared state を参照する最後の
future
• 条件ABCを全て満たす場合、
block し、タスクの完了を待つ
• それ以外の場合、
単にリソースを開放する
7
何故???
• 理由1: implicit detach は避けたかった
(Item 37 参照)
• 理由2: だからといって、std::thread のように
std::terminate を呼んでほしくなかった
(std::async は高級だから??)
• だから必要があれば implicit join することにした
• 色々と是非が議論された(らしい)が、C++11 から
C++14 においてはそのまま
8
future destructor の観察
9
int f() {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << “task end” << std::endl;
}
int main() {
{
std::packaged_task<int()> pt(f);
auto fut = pt.get_future();
#if 0
std::thread t(std::move(pt));
#elif 0
auto fut1 = std::async(std::launch::deferred, std::move(pt));
#elif 0
auto fut1 = std::async(std::launch::async, std::move(pt));
#endif
}
std::cout << “block end” << std::endl;
}
std::sync の返り値を受けな
かった場合
• std::launch::deferred
 結果を受けとる手段がないので永遠に実行
されない。
• std::launch::async
 その場で future が destructor が呼ばれ、
imlicit join によってタスク完了を待つ
10
eratta comments
Item 38 Things to remember
• Future の destructor は通常単にメンバの
destructor を呼んでメモリ開放するだけである
• std::async non-deferred 呼び出し経由の
shared state を持つ最後の future destructor は
タスク完了を待つ (implicit join())
11
感想
• deferred std::async
関数オブジェクトで良いのでは
• non-deferred std::async
promise/future 使ってくれる implicit join 機能付き
std::thread、しかも std::thread は誰かがよろしく管理
してくれる
• デフォルトポリシが std::launch::deferred |
std::launch::async って筋悪だと思う。
• よろしくスケジュールしてくれる(わけがない)
• どちらになったかで振る舞いが異なりすぎると思う
12

Mais conteúdo relacionado

Destaque

Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiTakashi Hoshino
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Mitsuru Kariya
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Mitsuru Kariya
 
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Takatoshi Kondo
 
Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27Mitsuru Kariya
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Akihiro Nishimura
 
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)Keisuke Fukuda
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーションTakashi Hoshino
 
Effective modern c++ 8
Effective modern c++ 8Effective modern c++ 8
Effective modern c++ 8uchan_nos
 
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...mooopan
 

Destaque (20)

Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86opti
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
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++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
 
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39Effective Modern C++ study group Item39
Effective Modern C++ study group Item39
 
Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27
 
Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26Effective Modern C++ 勉強会 Item26
Effective Modern C++ 勉強会 Item26
 
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)
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション
 
Effective modern c++ 8
Effective modern c++ 8Effective modern c++ 8
Effective modern c++ 8
 
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Emcpp item41
Emcpp item41Emcpp item41
Emcpp item41
 

Mais de Takashi Hoshino

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何かTakashi Hoshino
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level についてTakashi Hoshino
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3Takashi Hoshino
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法Takashi Hoshino
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Takashi Hoshino
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageTakashi Hoshino
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法Takashi Hoshino
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86optiTakashi Hoshino
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.Takashi Hoshino
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsTakashi Hoshino
 
Vmbkp: VMware vSphere Incremental Backup Tool
Vmbkp: VMware vSphere Incremental Backup ToolVmbkp: VMware vSphere Incremental Backup Tool
Vmbkp: VMware vSphere Incremental Backup ToolTakashi Hoshino
 

Mais de Takashi Hoshino (16)

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level について
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
 
WalB Driver Internals
WalB Driver InternalsWalB Driver Internals
WalB Driver Internals
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法
 
WalBの紹介
WalBの紹介WalBの紹介
WalBの紹介
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of Storage
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86opti
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu Labs
 
Vmbkp: VMware vSphere Incremental Backup Tool
Vmbkp: VMware vSphere Incremental Backup ToolVmbkp: VMware vSphere Incremental Backup Tool
Vmbkp: VMware vSphere Incremental Backup Tool
 
Inside database
Inside databaseInside database
Inside database
 

Effective Modern C++ 勉強会#8 Item38

  • 1. Effective Modern C++ 勉強会#8 Item 38 星野 喬(@starpoz) サイボウズ・ラボ 2015-08-19 1
  • 2. Item 38 Be aware of varying thread handle destructor behavior. 2
  • 3. Thread handles • ここでは std::thread と std::future, std::shared_future のこと • std::future と std::shared_future はこの資料で は合わせて future と呼ぶことにする 3
  • 4. std::thread destructor • joinable である場合、std::terminate が呼ばれ てプロセス停止 • implicit join/detach を避けた(Item 37 参照) 4
  • 5. future の destructor • 時には implicit join のように振る舞う • 時には implicit detach のように振る舞う • 時には何もしないように振る舞う • 何故??? 5
  • 6. callee 結果の保存場所 • callee (promise)でも caller (future) 側でもない • callee 側は先に destructor 呼ばれるケースあり • caller 側は future が移動/共有されるケースあり • future から参照され、参照カウントで管理され る shared state に結果が書かれる 6
  • 7. future destructor の振る舞い • 条件A: std::async 由来の shared state を参照 • 条件B: ポリシが std::launch::async • 条件C: 自分が shared state を参照する最後の future • 条件ABCを全て満たす場合、 block し、タスクの完了を待つ • それ以外の場合、 単にリソースを開放する 7
  • 8. 何故??? • 理由1: implicit detach は避けたかった (Item 37 参照) • 理由2: だからといって、std::thread のように std::terminate を呼んでほしくなかった (std::async は高級だから??) • だから必要があれば implicit join することにした • 色々と是非が議論された(らしい)が、C++11 から C++14 においてはそのまま 8
  • 9. future destructor の観察 9 int f() { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << “task end” << std::endl; } int main() { { std::packaged_task<int()> pt(f); auto fut = pt.get_future(); #if 0 std::thread t(std::move(pt)); #elif 0 auto fut1 = std::async(std::launch::deferred, std::move(pt)); #elif 0 auto fut1 = std::async(std::launch::async, std::move(pt)); #endif } std::cout << “block end” << std::endl; }
  • 10. std::sync の返り値を受けな かった場合 • std::launch::deferred  結果を受けとる手段がないので永遠に実行 されない。 • std::launch::async  その場で future が destructor が呼ばれ、 imlicit join によってタスク完了を待つ 10 eratta comments
  • 11. Item 38 Things to remember • Future の destructor は通常単にメンバの destructor を呼んでメモリ開放するだけである • std::async non-deferred 呼び出し経由の shared state を持つ最後の future destructor は タスク完了を待つ (implicit join()) 11
  • 12. 感想 • deferred std::async 関数オブジェクトで良いのでは • non-deferred std::async promise/future 使ってくれる implicit join 機能付き std::thread、しかも std::thread は誰かがよろしく管理 してくれる • デフォルトポリシが std::launch::deferred | std::launch::async って筋悪だと思う。 • よろしくスケジュールしてくれる(わけがない) • どちらになったかで振る舞いが異なりすぎると思う 12