英文:
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 "thread_pool.h"
#include <future>
#include <memory>
#include <chrono>
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<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());
}
}
I used my implementation of a task queue, which only handles std::function<void()>
.
By wrapping my std::packaged_task<int()>
into std::function<void()>
, I can reuse my task queue.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论