私の質問は、C++ 11 での ThreadPool クラスのこの実装からのものです。以下は、コードの関連部分です。
- が threadPool オブジェクトで呼び出されるたび
enqueueに、渡された関数と渡されたすべての引数をバインドして、shared_ptrofを作成しstd::packaged_taskます。
auto task = std::make_shared< std::packaged_task<return_type()> >(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
futurethisから を抽出std::packaged_taskして呼び出し元に返し、これtaskを a に格納しstd::queue<std::function<void()>> tasks;ます。コンストラクターでは、キュー内のタスクを待機し、見つかった場合はタスクを実行します。
for(size_t i = 0;i<threads;++i)
workers.emplace_back(
[this]
{
for(;;)
{
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queue_mutex);
this->condition.wait(lock,[this]{ return !this->tasks.empty(); });
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
}
);
さて、これに基づいて、私の質問は次のとおりです。
std::packaged_taskに格納されている場合は、オブジェクトにstd::queue<std::function<void()>>なるだけですよね? それでは、以前に抽出されstd::functionた共有状態にどのように書き込むのでしょうか?std::futureストアド
std::packaged_taskが単なるstd::functionオブジェクトではなく、ラムダ (コンストラクター内のコード) を介して実行さstd::packaged_taskれる場合でも、別のスレッドで実行されないのはなぜですか? 別のスレッドで実行されるはずですよね?std::threadtask()std::packaged_task
私の質問が示唆するように、私は への変換と の共有状態への書き込み機能を理解std::packaged_taskできませstd::functionん。このコードを n 個のスレッドでテストしたときはいつでも、取得できるスレッド ID の最大数は n でしたが、n を超えることはありませんでした。完全なコードは次のとおりです (のコードと、作成されたスレッドの数をカウントする main 関数も含まれています)。std::functionstd::futureThreadPool