#include <bits/stdc++.
h>
using namespace std;
class ThreadPool {
vector<thread> workers;
queue<function<void()>> tasks;
mutex m; condition_variable cv;
bool stop=false;
public:
explicit ThreadPool(size_t n=thread::hardware_concurrency()){
n = max<size_t>(1,n);
for(size_t i=0;i<n;i++){
workers.emplace_back([this]{
for(;;){
function<void()> job;
{
unique_lock<mutex> lk(m);
[Link](lk, [this]{return stop || ![Link]();});
if(stop && [Link]()) return;
job = move([Link]()); [Link]();
}
job();
}
});
}
}
template<class F, class...Args>
auto enqueue(F&& f, Args&&... args)->future<invoke_result_t<F,Args...>>{
using R=invoke_result_t<F,Args...>;
auto task = make_shared<packaged_task<R()>>(bind(forward<F>(f), forward<Args>(args)...));
future<R> res = task->get_future();
{
lock_guard<mutex> lk(m);
if(stop) throw runtime_error("enqueue on stopped ThreadPool");
[Link]([task]{ (*task)(); });
}
cv.notify_one();
return res;
}
~ThreadPool(){
{
lock_guard<mutex> lk(m);
stop=true;
}
cv.notify_all();
for(auto &w: workers) if([Link]()) [Link]();
}
};
int main(){
ThreadPool pool(4);
vector<future<int>> futs;
for(int i=0;i<10;i++){
futs.push_back([Link]([i]{ this_thread::sleep_for(chrono::milliseconds(50)); return i*i;
}
long long sum=0;
for(auto &f: futs) sum += [Link]();
cout << "Sum of squares 0..9 = " << sum << "\n";
return 0;
}