Linux 執行緒池

2021-09-07 20:51:23 字數 1839 閱讀 2287

首先,執行緒池是什麼?顧名思義,就是把一堆開闢好的執行緒放在乙個池子裡統一管理,就是乙個執行緒池。

其次,為什麼要用執行緒池,難道來乙個請求給它申請乙個執行緒,請求處理完了釋放執行緒不行麼?也行,但是如果建立執行緒和銷毀執行緒的時間比執行緒處理請求的時間長,而且請求很多的情況下,我們的cpu資源都浪費在了建立和銷毀執行緒上了,所以這種方法的效率比較低,於是,我們可以將若干已經建立完成的執行緒放在一起統一管理,如果來了乙個請求,我們從執行緒池中取出乙個執行緒來處理,處理完了放回池內等待下乙個任務,執行緒池的好處是避免了繁瑣的建立和結束執行緒的時間,有效的利用了cpu資源。

功能:節省大量執行緒建立銷毀成本,避免執行緒建立過多導致程式出錯。

分類:1.啟動時就建立固定數量的執行緒,一直處理請求------請求比較多,耗時較短。

2.啟動時不建立執行緒,當有請求時找空閒執行緒,如果沒有空閒執行緒,就建立乙個工作執行緒,如果工作執行緒等待超時,則工作執行緒退出釋放資源。-------請求一般較少,耗時較長,防止峰值壓力。

執行緒池 = 多個執行緒+任務佇列

用第一種方式實現乙個簡單的執行緒池:

#include

#include

#include

#include

#include

#include

using namespace std;

class task

bool run()

private:

void* _data;

};class threadpool

~threadpool()

bool init()

pthread_detach(tid);}}

bool addtask(task* t)

queuepush(t);

pthread_cond_signal(&_empty);

pthread_mutex_unlock(&_mutex);

return true;

}bool stop()

_stop_flag = 1;

while(_cur_thread > 0)

pthread_mutex_unlock(&_mutex);

return false;

}private:

bool empty()

bool full()

bool queuepush(task*www.michenggw.com task)

bool queuepop(task** task)

static void* thr_start(void *arg)

task *task;

p->queuepop(&task);

pthread_mutex_unlock(&p->_mutex);

pthread_cond_signal(&p->_full);

//任務的執行,需要放在解鎖外面,因為我們不知道任務需要執行多長時間

//如果先執行後解鎖,有可能其他執行緒一直無法獲取任務

task->run();

}return null;

}private:

int _max_thread;//最大執行緒數量

int _cur_thread;//當前執行緒數量

int _stop_flag;//執行緒池中線程的退出標誌

size_t _cap; //佇列最大節點數

queue_list;//執行緒池 任務佇列

pthread_mutex_t _mutex;

pthread_cond_t _empty;

pthread_cond_t _full;

};int main()

pool.stop();

return 0;

Linux執行緒池

linux下通用執行緒池的建立與使用 本文給出了乙個通用的執行緒池框架,該框架將與執行緒執行相關的任務進行了高層次的抽象,使之與具體的執行任務無關。另外該執行緒池具有動態伸縮性,它能根據執行任務的輕重自動調整執行緒池中線程的數量。文章的最後,我們給出乙個簡單示例程式,通過該示例程式,我們會發現,通過...

Linux 執行緒池

一.功能 執行緒池中有若干個執行緒,用於執行大量相對短暫的任務 二.功能描述 計算密集型任務 執行緒池中線程個數 cpu個數 i o密集型任務 執行緒池中線程個數 cpu個數 當任務增加時,可以動態增加執行緒池中線程個數,當任務執行完成後,可以動態減少執行緒池中線程個數 運用生產消費者模型,生產者執...

Linux 執行緒池

基礎概念 include include using namespace std include include include class task task void setdata int x,int y int run class threadpool void unlockqueue bo...