C++ And Beyond からのこのクリップの冒頭近くで、std::async
. 2 つの質問があります。
ジュニア開発者向けに、 を使用する際に何をすべきか、何を避けるべきかについての一連のルールはあり
std::async
ますか?このビデオで紹介されている問題は何ですか? それらはこの記事に関連していますか?
いくつかの問題があります:
std::async
起動ポリシーがないと、ランタイムライブラリは、新しいスレッドを開始するか、呼び出したスレッドget()
またはwait()
将来のスレッドでタスクを実行するかを選択できます。ハーブが言うように、これはあなたがおそらく使いたいと思うケースです。問題は、これによりランタイムライブラリのQoIが開いたままになり、スレッドの数を正しく取得できることです。また、タスクがそれ自体にスレッドを持っているかどうかわからないため、スレッドローカル変数を使用すると問題が発生する可能性があります。私が理解しているように、これはスコットが懸念していることです。
のポリシーを使用すると、またはstd::launch::deferred
を明示的に呼び出すまで、実際にはタスクが実行されません。これはほとんどあなたが望むものではないので、そうしないでください。get()
wait()
のポリシーを使用するとstd::launch::async
、新しいスレッドが開始されます。取得したスレッドの数を追跡しないと、実行中のスレッドが多すぎる可能性があります。
ハーブは、タスクが完了するのを待つことになっているデストラクタの動作を懸念していstd::future
ますが、MSVC2012には待機しないというバグがあります。
ジュニア開発者には、次のことをお勧めします。
std::async
デフォルトの起動ポリシーで使用します。