c 執行緒池的實現

2021-08-10 00:03:07 字數 3120 閱讀 3150

github 傳送門

------------------

1.使用例項

//測試job寫檔案

class job : public wjob

job() : job(-1) {};

void run();

#endif

3.wthread

對wthread的封裝,主要在於將之與wjob繫結以完成任務,並與執行緒池繫結,在任務結束後將自己放回空閒佇列

每乙個執行緒都執行run函式,用於等待任務

#ifndef _wthread_h

#define _wthread_h

#include #include #include #include "wjob.h"

class wthreadpool;

class wthread;

private:

//執行緒id

size_t mid;

//執行緒的函式

wjob *mjob;

//執行緒 初始即執行

std::thread *pmthread;

//全域性鎖

std::mutex mmutex;

//等待工作的條件變數

std::condition_variable waitjobcond;

//所關聯的執行緒池

wthreadpool &pool;

//執行緒狀態

thread_state mstate;

//執行緒執行的函式

void run();

public:

wthread(wthreadpool &wpool, size_t id);

wthread(wthreadpool &wpool);

virtual ~wthread();

//不可 賦值 複製

wthread(const wthread &) = delete;

wthread(const wthread &&) = delete;

wthread &operator = (const wthread&) = delete;

//設定工作並發布訊號

//無法分辨 job 是棧變數還是堆變數 因此不嘗試釋放

//為了提高效率 也不拷貝

bool setjob(wjob *job);

//結束

//是否該結束 由上層來判斷

void terminate();

//將父執行緒掛起

void join();

bool joinable();

};#endif

3.wthreadpool

執行緒池的封裝,它開闢乙個執行緒用於將任務佇列中的任務分發至空閒佇列中的空閒執行緒,每個空閒執行緒執行完任務後,會將自己放回空閒佇列,並繼續等待任務

其中的ts_queue 與 ts_list 為執行緒安全stl 詳見 

#ifndef _wthreadpool_h

#define _wthreadpool_h

#include #include #include #include "wthread.h"

#include "ts_list.h"

#include "ts_queue.h"

class wthreadpool;

private:

friend class wthread;

//退出的標誌任務

wjob *exitjob = (wjob*)1;

//初始化執行緒數

static const int initthreadnum = 15;

//執行緒數

size_t curthreadnum;

//用於 靜態儲存 池內執行緒的指標

std::vectorpthreadvec;

//忙碌執行緒佇列

ts_listbusyline;

//空閒執行緒佇列

ts_listidleline;

//任務佇列

ts_queuejobline;

//執行緒鎖

std::mutex mmutex;

//分派執行緒等待任務條件變數

std::condition_variable diswaitjobcond;

//分派執行緒等待空執行緒

std::condition_variable diswaitthreadcond;

//初始化執行執行緒池 變數

std::condition_variable initpoolcond;

//待處理任務數量

size_t jobnum;

//執行緒池狀態

pool_state poolstate;

//用於建立執行緒分派任務的執行緒

std::thread *dispatchthread;

//分發執行緒的函式

void run();

//將執行緒壓入空閒佇列

void pushtoidleline(wthread *thread);

//壓入忙碌佇列

void pushtobusyline(wthread *thread);

//找到並從忙碌佇列中移除

void removefrombusyline(wthread *thread);

public:

wthreadpool();

wthreadpool(size_t threadnum);

virtual ~wthreadpool();

wthreadpool(const wthreadpool &) = delete;

wthreadpool(wthreadpool &&) = delete;

wthreadpool &operator = (const wthreadpool&) = delete;

//開始接受任務

void start();

//新增job

void pushjob(wjob *job);

//用於父執行緒 輸入任意字元結束

void getchartoterminate();

};#endif

執行緒池的c 實現

emmmm,寫這個的主要目的是為了加深對互斥鎖和條件變數的理解,只看unix網路程式設計不實踐一下老覺得心裡沒點底,正好這個東西能練一下而且面試好像也有問到,就手動實現了一下 執行緒池運用的設計模式是命令模式,其原理基本上都能查到這裡就不多說了 直接上 好了 首先是任務類 task.h ifndef...

C 執行緒池的實現

寫了乙個簡易執行緒池,原理簡單介紹下,就是設定乙個任務佇列queue,用來放要執行的函式,還有乙個執行緒陣列vector,用來存放所有的執行緒。執行緒建立以後就存放在相應的vector裡,空閒的執行緒去queue裡去取要執行的函式位址,在run函式中執行,假如乙個執行緒的run函式執行好後,發現佇列...

c 執行緒池實現(四)執行緒池實現

前面已經說到了同步佇列的實現,下面來看執行緒池的實現。ifndef include threadpool define include threadpool include include include include include syncqueue.hpp namespace mythrea...