0

私の質問は、C++ 11 での ThreadPool クラスのこの実装からのものです。以下は、コードの関連部分です。

  1. が 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)...)
    );
  1. futurethisから を抽出std::packaged_taskして呼び出し元に返し、これtaskを a に格納しstd::queue<std::function<void()>> tasks;ます。

  2. コンストラクターでは、キュー内のタスクを待機し、見つかった場合はタスクを実行します。

    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();
                }
            }
        );

さて、これに基づいて、私の質問は次のとおりです。

  1. std::packaged_taskに格納されている場合は、オブジェクトにstd::queue<std::function<void()>>なるだけですよね? それでは、以前に抽出されstd::functionた共有状態にどのように書き込むのでしょうか?std::future

  2. ストアド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

4

0 に答える 0