#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class ThreadPool {
public:
ThreadPool(int numThreads):m_stop(false){
for (int i = 0; i < numThreads; ++i) {
threads.emplace_back([this] {
while (1) {
unique_lock<mutex> lock(m_mtx);
m_cv.wait(lock, [this] {
return !tasks.empty() || m_stop;
});
if (m_stop && tasks.empty())
{
return;
}
std::function<void()> task(std::move(tasks.front()));
tasks.pop();
lock.unlock();
task();
}
});
}
}
~ThreadPool() {
{
unique_lock<mutex> lock(m_mtx);
m_stop = true;
}
m_cv.notify_all();
for (auto& t : threads)
{
t.join();
}
}
template<typename F, class... Args>
void enQueue(F &&f, Args&&... args) {
function<void()> task =
bind(forward<F>(f), forward<Args>((args)...));
{
unique_lock<mutex> lock(m_mtx);
tasks.emplace(move(task));
}
m_cv.notify_one();
}
private:
vector<thread> threads;
queue<function<void()> > tasks;
mutex m_mtx;
condition_variable m_cv;
bool m_stop;
};
int main(){
ThreadPool pool(4);
for (size_t i = 0; i < 10; i++)
{
pool.enQueue([i] {
cout << "task:" << i << "is running" << endl;
});
}
system("pause");
return 0;
}

- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86