
270
|
7 章 並行 API
•
std::thread はメンバ変数の並びの末尾で宣言する。
項目 38:スレッドハンドルのデストラクタ動作の差異には注意する
項目 37 では、join 可能な std::thread は実行システムスレッドに対応すると述べました。遅延
させられないタスクの future も(項目 36 を参照)、システムスレッドに対し同様の関係を持ちま
す。そのため、std::thread オブジェクト、future オブジェクト、いずれもシステムスレッドのハ
ンドル(handle)とみなせます。
この観点に立つと、std::thread と future はそのデストラクタの動作が異なるという面白い点が
見えてきます。項目 37 でも述べたように、join 可能な std::thread を破棄するとプログラムは終
了します。他の 2 つの選択肢、暗黙の join と暗黙の detach、よりもましなものを選択した結果で
す。future のデストラクタは、暗黙に join したかのように振る舞うこともあれば、暗黙に detach
したかのように振る舞うこともあります。また、そのどちらにも該当しない場合もあります。しか
し、それでいてプログラムを終了させることは一切ありません。ブイヤベース4 のようなこのスレッ
ドハンドルの動作は詳細な調査に値します。
まず、future を、呼び出された側が呼び出した側へ実行結果を送信する通信チャネルの一端と考
えるところから始めます5。呼び出さ