#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
using namespace std;
class ThreadPool {
private:
typedef function<void()> Task;
public:
ThreadPool(int);
~ThreadPool();
bool start();
void put(Task task);
queue<Task> q;
private:
Task take();
int threadnum;
vector<thread> workers;
mutex mtx;
condition_variable cv;
void workfunc();
bool stop;
};
ThreadPool::ThreadPool(int num)
:threadnum(num),
stop(false)
{}
ThreadPool::~ThreadPool() {
stop = true;
cv.notify_all();
for (int i = 0; i < threadnum; ++i) {
workers[i].join();
}
}
bool ThreadPool::start() {
stop = false;
for (int i = 0; i < threadnum; ++i) {
workers.push_back(thread(&ThreadPool::workfunc, this));
}
return true;
}
void ThreadPool::put(Task task) {
unique_lock<mutex> ul(mtx);
q.emplace(task);
cv.notify_one();
}
ThreadPool::Task ThreadPool::take() {
unique_lock<mutex> ul(mtx);
cv.wait(ul, [this]() {
return !q.empty() || stop;
});
if (stop) return nullptr;
Task ret(move(q.front()));
q.pop();
return move(ret);
}
void ThreadPool::workfunc() {
while (!stop) {
Task t = take();
t();
}
}
void func1() {
for (int i = 0; i < 1000; ++i) cout << this_thread::get_id() << "第" << i << "次执行方法1" << endl;
}
void func2() {
for (int i = 0; i < 1000; ++i) cout << this_thread::get_id() << "第" << i << "次执行方法2" << endl;
}
void func3() {
for (int i = 0; i < 1000; ++i) cout << this_thread::get_id() << "第" << i << "次执行方法3" << endl;
}
void func4() {
for (int i = 0; i < 1000; ++i) cout << this_thread::get_id() << "第" << i << "次执行方法4" << endl;
}
void func5() {
for (int i = 0; i < 1000; ++i) cout << this_thread::get_id() << "第" << i << "次执行方法5" << endl;
}
int main() {
ThreadPool test(2);
test.start();
test.put(func1);
test.put(func2);
test.put(func3);
test.put(func4);
test.put(func5);
while (true);
return 0;
}