問題タブ [stdasync]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 複数の非同期タスクが完了するのを待ちます
次のようないくつかの非同期タスクを開始しています。
これらすべてのタスクが完了したかどうかを知る必要がある関数があります。
次のように非同期タスクを待機できることを理解しています。
そして、このリンクからわかるように、複数の先物を待っていますか? 複数の先物をまだ待っていないこと。
すべてのタスクが完了したかどうかを確認するために使用できるトリックはありますか?
それぞれの未来を配列またはベクトルに格納して、順番に待つことはできますか?
c++ - std::async は、void を返す関数に対して呼び出されることが保証されていますか?
Ubuntu で GCC 4.8.2 をstd::async()
返す関数をテストするために、次のコードを作成しました。void
がコメント解除されている場合i.get();
、メッセージ"Print here"
は常に存在します。ただし、i.get();
がコメント アウトされている場合は、 が定義されて"Print here"
いる場合にのみ存在しますUSE_ASYNC
(つまり、std::launch::async
常にメッセージが表示されますが、表示されstd::launch::deferred
ません)。
これは保証された動作ですか?非同期呼び出しが確実void
に実行されるようにする正しい方法は何ですか?
variadic-templates - std::bind を使用して「移動によって」パラメータ パックをキャプチャする
私はstd::async
最初から実装しようとしていますが、移動のみのタイプの引数で問題が発生しました。その要点は、C++ 14 init-captures を使用すると、「移動によって」または「完全な転送によって」単一の変数をキャプチャできるようになりますが、「移動によって」または「完全な転送によって」パラメータパックをキャプチャすることはできないようです。 "、 init-capture ではパラメーター パックをキャプチャできないため、名前付きキャプチャでのみ使用できます。
回避策のように見えるものを見つけました。使用std::bind
してパラメーターパックを「移動して」キャプチャし、ラッパーを使用してパラメーターをバインドオブジェクトのストレージから実際に呼び出したい関数のパラメータースロットに移動します. あまり気にしなければエレガントに見えます。しかし、もっと良い方法があるに違いないと考えずにはいられません — 理想的には、まったく依存しない方法std::bind
です。
std::bind
(最悪の場合、それを回避するために自分でどれだけ再実装する必要があるかを知りたいです。この演習のポイントの一部は、物事がどのように実装され、一番下なので、依存関係が非常に複雑になるのはstd::bind
本当に最悪です。)
私の質問は次のとおりです。
を使用せずにコードを機能させるにはどうすればよい
std::bind
ですか? (つまり、コア言語機能のみを使用します。一般的なラムダは公正なゲームです。)私の
std::bind
回避策は防弾ですか?つまり、STL がstd::async
機能し、私Async
が失敗する例を誰かが示すことができますか?C++1z でのパラメータ パック キャプチャをサポートするための議論や提案へのポインタは、ありがたく受け入れられます。
c++ - C++、Visual Studio: 予期しない std::async 戻り型
std::future
複数のを に保存しようとしていQMap
ます。これQMap
は私のクラスのメンバー変数です:
std::async
次のように、複数の呼び出しの結果をこのマップに保存したいと思います。
ここで非同期的に呼び出される関数readImage
は、次のようになります。
したがって、非同期関数の戻り値は になるはずstd::future<cv::Mat>
です。ただし、コンパイルしようとすると、Visual Studio 2015 で次のコンパイラ エラーが発生します。
私を困惑させているのは、私が期待std::future<cv::Mat (&)(QString path, bool emitSignals)>
したものとは異なるreturn type です。std::future<cv::Mat>
c++ - 非同期関数のエラー
静的クラスのstd::asyncを使用して次の関数をテストしたいのですが、主な目的は関数が実行されるまで待機することです。しかし、私は次のエラーに直面しています。このエラーの理由を教えてください。
上記の行をデバッグした後、次のエラーが発生します。
エラー LNK2019: 未解決の外部シンボル __imp___CrtDbgReportW が関数で参照されています "保護: __thiscall Concurrency::details::_RefCounter::_RefCounter(long)" (??0_RefCounter@details@Concurrency@@IAE@J@Z)
なぜ私がエラーを上回っているのか、誰かが私に答えることができますか。
どうもありがとう。
c++ - マルチスレッドを使用した for ループのパフォーマンスがシングルスレッドの場合ほど優れていないのはなぜですか?
行列計算などの単純で重い作業は、シングルスレッドよりもマルチスレッドで処理したほうがいいと思い、以下のコードをテストしてみました。
実行環境:
このプログラムをデバッグモードでビルドすると、期待どおりの結果が得られました。
これは、std::async を使用しないコードは、1 スレッドを使用するコードと同じパフォーマンスを持ち、4 または 8 スレッドを使用すると優れたパフォーマンスが得られることを示しています。
ただし、リリースモードでは、別の結果が得られました (N : 100000 -> 100000000):
この結果が気になります。後半のコードだけでも、マルチスレッドの方がシングルよりもパフォーマンスが優れています。しかし、最も速いのは std::async を使用しない前半のコードです。マルチスレッドに関する最適化とオーバーヘッドがパフォーマンスに大きな影響を与えるという事実を私は知っています。でも、
- プロセスはベクトルの計算だけなので、マルチスレッド コードではなくシングルスレッド コードで最適化できるものは何ですか?
- このプログラムにはミューテックスやアトミックなどは含まれておらず、データの競合は発生しない可能性があります。マルチスレッドに関するオーバーヘッドは比較的小さいと思います。
- std::async を使用しないコードでの CPU 使用率は、マルチスレッド コードよりも小さくなります。CPUの大部分を使用するのは効率的ですか?
更新: ベクトル化について調べてみました。/Qvec-report:1
オプションを有効
と実行時間:
マルチスレッド版では確かに for ループがベクトル化されていませんでした。ただし、その他の理由でバージョンアップに時間がかかる場合があります。
更新 2 : ラムダの for ループを書き直しました (タイプ A からタイプ B):
タイプBはうまくいきました。結果 :
タイプ B の結果は理解できます (マルチスレッド コードは、シングルスレッドのベクトル化されたコードよりも速く実行されますが、ベクトル化されたコードほど速くはありません)。一方、タイプ A はタイプ B (一時変数を使用するだけ) と同等のように見えますが、これらは異なるパフォーマンスを示します。2 つのタイプは、異なるアセンブリ コードを生成すると見なすことができます。
更新 3 : マルチスレッド for ループの速度を低下させた要因が見つかるかもしれません。状態での分割ですfor
。これはシングルスレッドのテストです:
そして実行時間:
バージョン 3 と 4は十分に最適化されており、バージョン 1はそれほど最適化されていませんでした。これは、N がconstexpr
. 同じ理由でver2もかなり遅かったと思います。コンパイラは、N と Q が変化しないことを理解していませんでした。そのため、この条件i < N / Q
には大量のアセンブリ コードが必要となり、for ループの速度が低下しました。