在C++中,对于std::packaged_task,是否有通用的线程池执行器?

huangapple go评论76阅读模式
英文:

Is there any common thread pool executor in C++ for std::packaged_task?

问题

在C++17中,我发现除了创建一个std::thread来执行std::packed_task并获取其结果之外,没有其他执行器。

我找到了一些关于std::packed_task执行器的demos。然而,这只是一个没有任何优化的演示。

不过,我想知道是否有一些成熟的线程池实现,可以执行std::packed_task

英文:

In C++17, I find no executor other than just creating a std::thread to execute a std::packed_task and then fetch its result.

I found some demos of executors for std::packed_task. However this is just a demo without any optimization.

However, I wonder if there are some mature implementation of thread pool that can execute a std::packed_task?

答案1

得分: 0

根据 @Pepijn Kramer 的评论,我有以下实现。

#include "thread_pool.h"
#include <future>
#include <memory>
#include <chrono>

int main() {
    using namespace std::chrono_literals;
    int total = 10;
    int thread_size = 4;
    // 来自 thread_pool.h 的部分
    Nuke::ThreadExecutor pool(thread_size);

    std::vector<std::future<int>> futs;
    for (int i = 0; i < total; i++) {
        using P = std::packaged_task<int()>;
        std::shared_ptr<P> task = std::make_shared<P>([i]() {
            std::this_thread::sleep_for(1000ms);
            return i;
        });
        futs.emplace_back(task->get_future());
        pool.add_task([task]() { (*task)(); });
    }

    for (int i = 0; i < total; i++) {
        printf("%d\n", futs[i].get());
    }
}

我使用了我的实现的任务队列,该队列仅处理 std::function<void()>

通过将我的 std::packaged_task<int()> 包装成 std::function<void()>,我可以重复使用我的任务队列。

英文:

According to @Pepijn Kramer's comment, I have the following implementation.

#include &quot;thread_pool.h&quot;
#include &lt;future&gt;
#include &lt;memory&gt;
#include &lt;chrono&gt;

int main() {
    using namespace std::chrono_literals;
    int total = 10;
    int thread_size = 4;
    // From thread_pool.h
    Nuke::ThreadExecutor pool(thread_size);

    std::vector&lt;std::future&lt;int&gt;&gt; futs;
    for (int i = 0; i &lt; total; i++) {
        using P = std::packaged_task&lt;int()&gt;;
        std::shared_ptr&lt;P&gt; task = std::make_shared&lt;P&gt;([i]() {
            std::this_thread::sleep_for(1000ms);
            return i;
        });
        futs.emplace_back(task-&gt;get_future());
        pool.add_task([task]() { (*task)(); });
    }

    for (int i = 0; i &lt; total; i++) {
        printf(&quot;%d\n&quot;, futs[i].get());
    }
}

I used my implementation of a task queue, which only handles std::function&lt;void()&gt;.

By wrapping my std::packaged_task&lt;int()&gt; into std::function&lt;void()&gt;, I can reuse my task queue.

huangapple
  • 本文由 发表于 2023年1月9日 11:42:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/75052981.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定