問題タブ [packaged-task]
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.
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++ - この構文は何を意味するか、`class templateクラス名`
私はC++でマルチスレッドプログラミングについてもっと試してみましたが、理解するのに苦労しstd::promise
ていたので、このWebサイトで答えを探し始めました。しかし、答えを読んでさらに混乱しました。これは、おそらく同様の実装である答えのコードですstd::packaged_task
このコードでは、
1- この構文の意味template <typename R, typename ...Args> class my_task<R(Args...)>
、より具体的には、 の目的は<R(Args...)>
何ですか?
2-クラスの前方宣言があるのはなぜですか?
ありがとう
c++ - packaged_task がスレッドにラップされている場合の C++ 未指定の future_errc 値、コード 4
以下のコードが示すように、packaged_task を渡して独自のスレッド クラスを実装しようとしています。次に、この packaged_task からの未来を待ちます。このコードが 4 秒待機すると、未来から 0xcdcdcdcd を取得できると予想されます。
しかし、待機はこのタスクをすぐに終了するようです。このコードを実行してコンパイルすると、すぐに出力されます
環境はOS X 10.11.1、
コンパイルコマンドは
他のプラットフォームで再現されるかどうかはわかりません。
前もって感謝します。
編集
解決済み: これは、現在のコンストラクターが、スレッドによって参照が使用されている、移動されたの有効mythread
期間を制御するためです。f
ただし、コンストラクターはスレッドを作成した直後に戻るため、スレッドが破棄されf
たローカル変数を保持している間、 を含むすべてのローカル変数が破棄されます。
修正したコードは
の制御f
がさらにスレッドに移動する場所。
c++ - C++ Future with Arguments エラー
以下は、packaged_task を試して実行するために使用しているコードです。ただし、コンパイルしようとすると、次のエラーが表示されます。
'std::function<_Ret(CStore &, FileDetails &)>::function(std::function<_Ret(CStore &, FileDetails &)> &&)': cannot convert argument 1 from 'long(__cdecl &)(CStore &, std::vector<FileDetails, std::allocator<_Ty>> &)' to 'std::nullptr_t'
CheckIfFilesExist に 2 番目の引数を追加する前にこれを機能させていましたが、2 番目の引数を追加すると、事態が不安定になり始めました。どんな洞察も大歓迎です!
CStore は、いくつかのメンバー変数と次の関数を保持する単なる基本クラスです。
c++ - std::packaged_task を使用して CAsyncSocket-Detach-socket タスクをキューに入れると、非静的 Attach が静的メソッドから呼び出されたときにコンパイル エラーが発生する
コードを実装しているので、ネットワーク接続が到着したら受け入れ、到着ソケットから切り離し、std::packaged_task タスクを作成し、そのタスクを deque コンテナーにキューに入れ、後でそれらのタスクをタスク スレッドで実行します。Bo Qian の YouTube レクチャー「C++ Threading #9: packaged_task」では、これを簡単に行う方法が説明されています。
私の StartDecode は非静的 Attach を呼び出そうとする静的メソッドであるため、私の場合、コードはコンパイルされません。std::bind を使用して「ソケット」をタスクにバインドするため、StartDecode は静的メソッドです。'socket' は通常 StartDecode メソッドに渡されますが、パッケージ化されたタスクの 'future' が適切に機能するためには、渡されたパラメーターを std::bind を使用して事前にバインドする必要があります。ただし、StartDecode が静的になると、静的ではない CAsyncSocket の Attach を呼び出すと、エラー C2352 が発生します。
静的 MyRxDecode::StartDecode から非静的 Attach メソッドを呼び出すにはどうすればよいですか? ソケットパラメーターを静的にせずにタスクにバインドする必要を回避する方法はありますか?
c++ - スレッドが戻り値を packaged_task の future オブジェクトに代入するのではなく、関数オブジェクトを呼び出すのはなぜですか?
packaged_task を使用して関数の戻り値を取得する方法を学びたいです。
以下のコードでは、関数 DoTask を実行するスレッドを作成します。次に、その関数を packaged_task にバインドし、packaged_task myTask にバインドするまで待機させます。myTask の future オブジェクトを抽出します。ここで、DoTask (notify_one) の条件変数のブロックを解除して、実行を完了させます。DoTask の return bool の値を取得するために、myTask の future に対して get() を実行します。
しかし、DoTask が戻るのを待つ代わりに、DoTask は「関数オブジェクトの呼び出し」を行うコードに入り、get() は実行されません。
DoTask が私が期待していた未来を設定するのを妨げ、代わりに関数オブジェクトを呼び出すのは何ですか?
c++ - メンバー関数は、std::function を使用してフリー関数が使用できる場所ならどこでも使用できますか?
私はいくつかのコード (GitHub の progschj の厚意による) を持っています。MakeTask は、すべての関数とその引数を MakeTask に移動し、packaged_task を作成します。作成されたタスクが実行され、その未来が呼び出し元に返されます。これは非常に洗練されていますが、メンバー関数でもこれを実行できるようにしたいと考えています。しかし、Func を構造体に入れると、MakeTask の F&& はコードに記載されているエラーで失敗します。
Func を静的に変更すれば機能させることができますが、アプリ コードの他の部分が壊れてしまいます。
Edit1: std::function の構文を理解し、新しいエラー メッセージでサンプルを修正しました。MakeTask の F&& move 引数は、私の aFunc を呼び出し可能なオブジェクトとして受け入れません。
Edit2: Barry の回答のため、サンプル コードを元の投稿に戻して、彼の回答が将来の視聴者にとって意味のあるものになるようにします。
c++ - c++ packaged_task を使用して生産者と消費者のパターンを構築する
次のように、プロデューサー/コンシューマー パターン コードを作成するために packaged_task を試みています。
タスクをキューtest_thread9_producer1
にtest_thread9_producer2
プッシュし、キューtest_thread9_consumer1
からタスクを取得して実行します。
ただし、実行test_thread9
すると、タスクは正しく実行されますが、デバッグ エラーで終了します: 中止が呼び出されました。なぜだかわかりません。をもっと理解するのを手伝ってくれる人はいpackaged_task
ますか?
2 番目の問題: コンシューマーがループで実行されているため、2 つのプロデューサーがすべてのタスクをキューにプッシュし、キュー内のすべてのタスクを実行し終わったときに終了while(1)
させる適切な方法が思いつきません 。誰か私に提案をしてもらえますか?test_thread9_consumer1
test_thread9_consumer1