18

C++ And Beyond からのこのクリップの冒頭近くで、std::async. 2 つの質問があります。

  1. ジュニア開発者向けに、 を使用する際に何をすべきか、何を避けるべきかについての一連のルールはありstd::asyncますか?

  2. このビデオで紹介されている問題は何ですか? それらはこの記事に関連していますか?

4

2 に答える 2

23

いくつかの問題があります:

  1. std::async起動ポリシーがないと、ランタイムライブラリは、新しいスレッドを開始するか、呼び出したスレッドget()またはwait()将来のスレッドでタスクを実行するかを選択できます。ハーブが言うように、これはあなたがおそらく使いたいと思うケースです。問題は、これによりランタイムライブラリのQoIが開いたままになり、スレッドの数を正しく取得できることです。また、タスクがそれ自体にスレッドを持っているかどうかわからないため、スレッドローカル変数を使用すると問題が発生する可能性があります。私が理解しているように、これはスコットが懸念していることです。

  2. のポリシーを使用すると、またはstd::launch::deferredを明示的に呼び出すまで、実際にはタスクが実行されません。これはほとんどあなたが望むものではないので、そうしないでください。get()wait()

  3. のポリシーを使用するとstd::launch::async、新しいスレッドが開始されます。取得したスレッドの数を追跡しないと、実行中のスレッドが多すぎる可能性があります。

  4. ハーブは、タスクが完了するのを待つことになっているデストラクタの動作を懸念していstd::futureますが、MSVC2012には待機しないというバグがあります。

ジュニア開発者には、次のことをお勧めします。

  • std::asyncデフォルトの起動ポリシーで使用します。
  • すべての先物を明示的に待つようにしてください。
  • 非同期タスクでスレッドローカルストレージを使用しないでください。
于 2012-09-20T10:27:45.880 に答える