gpt4 book ai didi

c++ - 用线程池替换许多 std::async 调用

转载 作者:太空狗 更新时间:2023-10-29 23:17:57 57 4
gpt4 key购买 nike

我有一个多次调用 std::async 的程序。执行的任务很短(每个任务只有几百毫秒)。我认为线程创建有很大的开销,我想知道我是否可以以某种方式避免这种情况。枚举作业的代码运行速度比处理作业快得多。因此,我已经有了某种集合。它是这样的。我创建了一个“工作槽”数组:

template <typename T>
struct job {
std::future <void> fut;
std::vector <T*> *result;
bool inUse;
}

在并行代码开始之前,我初始化作业槽数组,只创建一次结果 vector 。然后,每当工作枚举代码枚举了一个工作时,它就会寻找一个未被使用的工作槽。如果有空闲插槽,它将开始(使用 std::async)一项新工作,将 future 移动到插槽中。作业运行并填充结果 vector 。如果没有空闲槽,则代码检查槽中的任何 future 是否准备就绪。如果是,它处理结果 vector ,然后使用那个槽。如果没有,它会等待几毫秒。这段代码运行得非常好,并且可以精确地扩展到可用处理器的数量。我了解到每次调用 std::async 都会创建一个新线程,事实上,我可以看到进程 ID 滚动。我想消除这种开销,一开始就一劳永逸地创建线程。如何进行?

我找到了这个线程池实现 https://code.google.com/p/cppthreadpool/downloads/list但它指出一项任务应该花费一两秒钟才能使其有效。我不需要任何花哨的调度、优先级等。我只是想消除重复构建和销毁线程的开销。

最佳答案

我运行了一个使用 std::async 创建任务的测试程序,发现许多任务由同一个线程运行!!事实上,我看到 2 个线程运行了 25 个异步任务。所以看起来标准库已经做了一些线程池。

    std::vector<std::future<void>> futures;
for (int i = 0; i < 25; ++i)
{
auto fut = std::async([]
{
std::cout << std::this_thread::get_id() <<std::endl;
});
futures.push_back(std::move(fut));
}
std::for_each(futures.begin(), futures.end(), [](std::future<void> & fut)
{
fut.wait();
});

关于c++ - 用线程池替换许多 std::async 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15904118/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com