Linux系统编程---18(线程池相关概念及其实现)
生活随笔
收集整理的這篇文章主要介紹了
Linux系统编程---18(线程池相关概念及其实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線程池
概念:
一堆線程+任務隊列
作用
實現
創建固定數量的線程+創建一個線程安全的任務隊列
一種線程使用模式。
線程池應用場景
線程池的分類
特點介紹
FixedThreadPool
CachedThreadPool
ScheduledThreadPool
SingleThreadPool
線程池實現
#include <iostream> #include <queue> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <pthread.h>typedef bool (*task_callback)(int data); class Task {public:Task(){} Task(int data, task_callback handler){_data = data;_handler = handler;} ~Task(){} public://設置任務處理的數據以及處理方法void SetTask(int data, task_callback handler){_data = data;_handler = handler;} //執行任務bool Run() {return _handler(_data);} private:int _data;task_callback _handler; }; #define MAX_THR 5 #define MAX_QUE 10 class ThreadPool {public:ThreadPool(int qmax = MAX_QUE, int tmax = MAX_THR):_thr_max(tmax), _capacity(qmax), _thr_cur(tmax){pthread_mutex_init(&_mutex, NULL);pthread_cond_init(&_cond_con, NULL);pthread_cond_init(&_cond_pro, NULL);}~ThreadPool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond_con);pthread_cond_destroy(&_cond_pro);}public:static void *thr_start(void *arg) {ThreadPool *pool = (ThreadPool*)arg;while(1) {pool->QueueLock();while(pool->QueueIsEmpty()){pool->ConWait();}Task tt;pool->QueuePop(&tt);pool->ProWakeUp();pool->QueueUnLock();//為了防止處理時間過長導致其它線程無法獲取鎖//因此解鎖之后才進行處理tt.Run();}return NULL;}bool ThreadPoolInit() {pthread_t tid;int ret, i;for (i = 0; i < _thr_max; i++) {ret = pthread_create(&tid, NULL, thr_start,(void*)this);if (ret != 0) {std::cout<<"thread create error\n";return false; }pthread_detach(tid);}return true;}void AddTask(Task tt) {//向線程池添加任務QueueLock();while(QueueIsFull()) {ProWait();}QueuePush(tt);ConWakeUp();QueueUnLock();}void ThreadPoolQuit(){//退出線程池中所有的線程_quit_flag = true;while(_thr_cur > 0) {ConWakeUpAll(); usleep(1000);}return;}private:void QueuePush(Task tt){_queue.push(tt);}void QueuePop(Task *tt){*tt = _queue.front();_queue.pop();}void QueueLock(){pthread_mutex_lock(&_mutex);}void QueueUnLock(){pthread_mutex_unlock(&_mutex);}void ProWait(){pthread_cond_wait(&_cond_pro, &_mutex);} void ProWakeUp(){pthread_cond_signal(&_cond_pro);}void ConWait(){//進入這個函表示現在沒有任務if (_quit_flag == true) {//若線程池要求退出_thr_cur--;std::cout<<"thread:"<<pthread_self()<<"exit\n";pthread_mutex_unlock(&_mutex);pthread_exit(NULL);}pthread_cond_wait(&_cond_con, &_mutex);}void ConWakeUp(){pthread_cond_signal(&_cond_con);}void ConWakeUpAll(){pthread_cond_broadcast(&_cond_con);}bool QueueIsFull(){return (_queue.size() == _capacity);}bool QueueIsEmpty(){return _queue.empty();}private:int _thr_max;int _thr_cur;int _quit_flag;std::queue<Task> _queue;int _capacity;pthread_mutex_t _mutex;pthread_cond_t _cond_pro;pthread_cond_t _cond_con; }; bool task_handler(int data){//休眠一段時間srand(time(NULL));int sec = rand()%5;std::cout<<"thread:"<<pthread_self()<<" sleep "<<sec<<"second\n";sleep(sec);return true; } int main() {ThreadPool pool;Task tt[10];pool.ThreadPoolInit();int i;for (i = 0; i < 10; i++) {tt[i].SetTask(i, task_handler);pool.AddTask(tt[i]);}pool.ThreadPoolQuit();return 0; }總結
以上是生活随笔為你收集整理的Linux系统编程---18(线程池相关概念及其实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼手机什么时候上市2016年
- 下一篇: Linux中netstat工具详解