私の質問は、C++ 11 での ThreadPool クラスのこの実装からのものです。以下は、コードの関連部分です。
- が threadPool オブジェクトで呼び出されるたび
enqueue
に、渡された関数と渡されたすべての引数をバインドして、shared_ptr
ofを作成しstd::packaged_task
ます。
auto task = std::make_shared< std::packaged_task<return_type()> >(
std::bind(std::forward<F>(f), std::forward<Args>(args)...)
);
future
thisから を抽出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::thread
task()
std::packaged_task
私の質問が示唆するように、私は への変換と の共有状態への書き込み機能を理解std::packaged_task
できませstd::function
ん。このコードを n 個のスレッドでテストしたときはいつでも、取得できるスレッド ID の最大数は n でしたが、n を超えることはありませんでした。完全なコードは次のとおりです (のコードと、作成されたスレッドの数をカウントする main 関数も含まれています)。std::function
std::future
ThreadPool