涉及到很多C++11的新特性,function+bind+模板实现了多态化,代码如下:
#include<iostream>
#include<thread>
#include<mutex>
#include<string>
#include<condition_variable>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
class ThreadPool{
public:
ThreadPool(int numThreads):stop(false){
for(int i = 0; i < numThreads ; i++){
threads.emplace_back([this]{
while (1)
{
unique_lock<mutex> lock(mtx);
condition.wait(lock, [this]{
return !tasks.empty() || stop;
});
if(stop && tasks.empty()) return;
function<void()> task(move(tasks.front()));
tasks.pop();
lock.unlock();
task();
}
});
}
}
~ThreadPool(){
{
unique_lock<mutex> lock(mtx);
stop = true;
}
condition.notify_all();
for(auto &t : threads){
t.join();
}
}
//加任务
template<typename F, typename... Args>
void enqueue(F&& f, Args&&... args){
function<void()> task =
bind(forward<F>(f), forward<Args>(args)...);
{
unique_lock<mutex> lock(mtx);
tasks.emplace(move(task));
}
condition.notify_one();
}
private:
vector<thread> threads;
queue<function<void()>> tasks;
mutex mtx;
condition_variable condition;
bool stop;
};
int main() {
ThreadPool pool(4);
for (int i = 0; i < 8; ++i) {
pool.enqueue([i] {
std::cout << "Task " << i+1 << " is running in thread " << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Task " << i+1 << " is done" << std::endl;
});
}
return 0;
}
跟着视频敲的,以我目前的实力,暂时想不到任何可以改进的方法,视频中所提到的单例模式是可以加上去的。
视频原址如下: