問題タブ [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.
c++ - scoped_lock を使用して、相互排除でキューから packaged_task を抽出した後に実行する
scoped_lock を使用して 2 つのミューテックスをロックした後、キューから抽出されたタスクを実行する必要があります。問題は、タスクをキューから別のタスクにスワップしてから実行することです。これまでのところ、これが私の出発点です
しかし、タスクを変数に保存して後で実行することはできません。
c++11 - std::packaged_task のクラッシュの検出
パッケージ化されたタスクが正常に完了したかどうかを検出したいのですが、タスクのエラーが原因でスレッドがクラッシュするというエッジケースがいくつかあります (一部のサードパーティコードから)。これらの場合、以下のコードでは例外がキャッチされず、スレッドがクラッシュしたことを知ることができません。future_status は、クラッシュ時に準備完了として設定されます。ただし、スレッドに参加する前に .get() で結果を取得しようとすると、future は内部で _M_state->wait を呼び出した後に中止されます。内部的には、未来の _M_state._M_result がガベージで満たされていることがわかります。
タスクが正常に完了したかどうかを判断する方法を考えられる人はいますか?
終わり
multithreading - std::packaged_task と std::function の動作
私の質問は、C++ 11 での ThreadPool クラスのこの実装からのものです。以下は、コードの関連部分です。
- が threadPool オブジェクトで呼び出されるたび
enqueue
に、渡された関数と渡されたすべての引数をバインドして、shared_ptr
ofを作成しstd::packaged_task
ます。
future
thisから を抽出std::packaged_task
して呼び出し元に返し、これtask
を a に格納しstd::queue<std::function<void()>> tasks;
ます。コンストラクターでは、キュー内のタスクを待機し、見つかった場合はタスクを実行します。
さて、これに基づいて、私の質問は次のとおりです。
std::packaged_task
に格納されている場合は、オブジェクトにstd::queue<std::function<void()>>
なるだけですよね? それでは、以前に抽出されstd::function
た共有状態にどのように書き込むのでしょうか?std::future
ストアド
std::packaged_task
が単なるstd::function
オブジェクトではなく、ラムダ (コンストラクター内のコード) を介して実行さstd::packaged_task
れる場合でも、別のスレッドで実行されないのはなぜですか? 別のスレッドで実行されるはずですよね?std::thread
task()
std::packaged_task
私の質問が示唆するように、私は への変換と の共有状態への書き込み機能を理解std::packaged_task
できませstd::function
ん。このコードを n 個のスレッドでテストしたときはいつでも、取得できるスレッド ID の最大数は n でしたが、n を超えることはありませんでした。完全なコードは次のとおりです (のコードと、作成されたスレッドの数をカウントする main 関数も含まれています)。std::function
std::future
ThreadPool