当前位置: 首页> 汽车> 报价 > <Linux> 实现简易线程池

<Linux> 实现简易线程池

时间:2025/7/12 1:49:41来源:https://blog.csdn.net/m0_65140768/article/details/139966665 浏览次数: 0次

文章目录

  • ThreadPool.hpp
  • Thread.hpp
  • LockGuard.hpp
  • Task.hpp
  • test.cc

ThreadPool.hpp

#pragma once
#include <vector>
#include <queue>
#include <iostream>#include "Thread.hpp"
#include "LockGuard.hpp"#define g_threadPool_num 5
template <class T>
class ThreadPool
{
public:bool isEmpty(){return _task_queue.empty();}void waitCond(){pthread_cond_wait(&_cond, &_mtx);}T getTask(){T t = _task_queue.front();_task_queue.pop();return t;}public:ThreadPool(int threadNum = g_threadPool_num): _threads(threadNum){pthread_cond_init(&_cond, nullptr);pthread_mutex_init(&_mtx, nullptr);for (size_t i = 0; i < threadNum; i++){_threads[i] = new Thread(routine, this, i + 1);}}static void *routine(void *args){ThreadData *td = (ThreadData *)args;ThreadPool<T> *tp = (ThreadPool<T> *)td->_args;while (true){T task(-1);{LockGuard lock(&tp->_mtx);while (tp->isEmpty()){tp->waitCond();}task = tp->getTask();}// 仿函数task(td->_name);}return nullptr;}void pushTask(const T &task){LockGuard lock(&_mtx);_task_queue.push(task);pthread_cond_signal(&_cond);}void run(){for (auto &e : _threads){e->start();}}~ThreadPool(){for (auto &e : _threads){e->join();}pthread_cond_destroy(&_cond);pthread_mutex_destroy(&_mtx);}private:std::vector<Thread *> _threads;std::queue<T> _task_queue;pthread_mutex_t _mtx;pthread_cond_t _cond;
};

Thread.hpp

#pragma once
#include <string>
#include <pthread.h>
#include <iostream>
typedef void *(*fun_t)(void *);class ThreadData
{
public:void *_args;std::string _name;pthread_t _tid;fun_t _fun;
};
class Thread
{
public:Thread(fun_t callback, void *args, int num){char nameBuffer[64] = "Thread --- ";sprintf(nameBuffer, "%s%d", nameBuffer, num);_td._name = nameBuffer;_td._args = args;_td._fun = callback;}void start(){pthread_create(&_td._tid, nullptr, _td._fun, &_td);}void join(){pthread_join(_td._tid, nullptr);}public:ThreadData _td;
};

LockGuard.hpp

#pragma once#include <pthread.h>class Mutex
{
public:Mutex(pthread_mutex_t *mtx): _pmtx(mtx){pthread_mutex_init(_pmtx, nullptr);}void lock(){pthread_mutex_lock(_pmtx);}void unlock(){pthread_mutex_unlock(_pmtx);}~Mutex(){pthread_mutex_destroy(_pmtx);}private:pthread_mutex_t *_pmtx;
};class LockGuard
{
public:LockGuard(pthread_mutex_t *mtx): _mtx(mtx){_mtx.lock();}~LockGuard(){_mtx.unlock();}private:Mutex _mtx;
};

Task.hpp

#pragma once
#include <iostream>
class Task
{public:Task(int num): _num(num){}void operator()(const std::string &name){std::cout << name << " 执行" << _num << "任务" << std::endl;}private:int _num;
};

test.cc

#include "ThreadPool.hpp"
#include "Task.hpp"
#include <unistd.h>
int main()
{ThreadPool<Task> tp;tp.run();int index = 0;while (true){Task t(index++);tp.pushTask(t);sleep(1);}return 0;
}
关键字:<Linux> 实现简易线程池

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: