
項目 37:std::thread はすべての場面で join 不可にする
|
261
auto fut = reallyAsync(f); // run f asynchronously;
// throw if std::async
// would throw
f を非同期に実行。std::async が例外
を発生させる場合は同様に発生させる
C++14 では、現代的に、reallyAsync 宣言時に戻り型を推論する機能が使えます。
template<typename F, typename... Ts>
inline
auto // C++14
reallyAsync(F&& f, Ts&&... params)
{
return std::async(std::launch::async,
std::forward<F>(f),
std::forward<Ts>(params)...);
}
このバージョンでは、reallyAsync がローンチポリシに std::launch::async を指定した std::
async を実行する以外、何もしないことが非常に明解です。
重要ポイント
•
std::async のディフォルトのローンチポリシは、タスクの同期実行、非同期実行いずれも許
容する。
•
この柔軟性は、thread_local な変数を使用する場合の非決定性につながる。タスクがまっ
たく実行されない恐れもあり、プログラムがタイムアウトベースの wait を実行する場合に
は問題となる。
•
タスクの非同期実行が必要不可欠の場合は、 ...