#include <iostream>
#include <thread>
#include <mutex>
#include <string>
#include <condition_variable>
#include <queue>
#include <Windows.h>
#include <vector>
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;
}
线程池的实现
最新推荐文章于 2024-10-19 15:29:34 发布