极简c++线程池
多个线程不断取任务
#include <thread>
#include <mutex>
template <typename F, typename T, typename R>
void mThreadPool(const int size, F &&func, vector<T> &tasks,vector<R> &results)
{
std::mutex mutex;
int task_id = 0;
vector<thread> ts = vector<thread>();
if(results.size()!=tasks.size())results=vector<R>(tasks.size());
for (int i = 0; i < size; i++)
ts.emplace_back(
[&]
{
while (true)
{
mutex.lock();
int id = task_id++;
mutex.unlock();
if (id >= tasks.size())
return;
R r=func(tasks[id]);
mutex.lock();
results[id]=r;
mutex.unlock();
} });
for (auto &t : ts)
t.join();
}
参数
- 线程池大小
- 函数
- 返回值数组
模板参数不会写,因此函数只能单输入,可用tuple拓展
测试样例
int fun(tuple<int, int> d){
auto &[a, b] = d;
int c = a + b;
sleep(c);
cout << c << endl;
return c;
}
int main(){
vector<tuple<int, int>> arg;
for (int i = 0; i < 4; i++) arg.push_back({1, 1});
for (int i = 0; i < 4; i++) arg.push_back({2, 2});
vector<int> res;
mThreadPool(4, fun, arg, res);
for (auto &x : res) cout << x << endl;
return 0;
}