C 執行緒池的實現

2022-06-16 20:03:08 字數 3685 閱讀 3490

寫了乙個簡易執行緒池,

原理簡單介紹下,就是設定乙個任務佇列queue,用來放要執行的函式,還有乙個執行緒陣列vector,用來存放所有的執行緒。

執行緒建立以後就存放在相應的vector裡,空閒的執行緒去queue裡去取要執行的函式位址,在run函式中執行,假如乙個執行緒的run函式執行好後,

發現佇列沒有任務可取,則阻塞該執行緒,通過conidtion_variable變數的wait()函式進行阻塞,等待新的任務被新增進來後,會有乙個cond變數的notify_one()

函式來喚醒阻塞中的run函式。

現在放**吧!

執行緒池標頭檔案thread_pool.h

/*

*******************************************

執行緒池標頭檔案

author:十面埋伏但莫慌

time:2020/05/03

********************************************

*/#pragma once#ifndef _thread_pool_h_

#define _thread_pool_h_#include

#include

#include

#include

#include

#include

typedef std::function

func;//

定義執行緒執行函式型別,方便後面編碼使用。

//任務類

templateclass

task

~task() {}

int push(t func)//

新增任務;

catch

(std::exception e)

return1;

}int gettasknum()//

獲得當前佇列中的任務數;

t pop()

//取出待執行的任務;

}private

:

std::queue

tasks;//

任務佇列

};//

執行緒池類

class

thread_pool

~thread_pool();

int addtasks(func&& tasks);//

新增任務;

void start();//

開啟執行緒池;

void stop();//

關閉執行緒池;

int gettasknum();//

獲得當前佇列中的任務數;

private

:

void run();//

執行緒工作函式;

private

:

static

const

int maxthreadnum = 3;//

最大執行緒數為3;

std::mutex mx;//

鎖; std::condition_variable cond;//

條件量;

std::vectorthreads;//

執行緒向量;

bool isstart;//

原子變數,判斷執行緒池是否執行;

tasktasks;//

任務變數;

};#endif

執行緒池實現檔案 thread_pool.cpp

/*

*******************************************

執行緒池cpp檔案

author:十面埋伏但莫慌

time:2020/05/03

********************************************

*/#include

"thread_pool.h

"#include

int thread_pool::addtasks(func&&func)

return

ret;

}void

thread_pool::start()

threads.reserve(maxthreadnum);

for (int i = 0; i < maxthreadnum; i++)

}}void

thread_pool::run()

if(f)

f();

}}int

thread_pool::gettasknum()

void

thread_pool::stop()

cond.notify_all();

for(auto t : threads)

}std::cout

<< "

所有執行緒已停止。

"<}thread_pool::~thread_pool()

}

測試用的main.cpp檔案

#include#include

"thread_pool.h

"using

namespace

std;

void

string_out_one()

}void

string_out_two()

void

string_out_three()

void

string_out_four()

intmain()

catch

(std::exception e)

pool.addtasks(move(string_out_one));

pool.addtasks(move(string_out_two));

pool.addtasks(move(string_out_three));

pool.addtasks(move(string_out_four));

/*實驗對比**段1結束處

*//*

實驗對比**段2開始處

*///

string_out_one();

//string_out_two();

//string_out_three();

//string_out_four();

/*實驗對比**段2結束處

*/finish =clock();

totaltime = (double)(finish - start) /clocks_per_sec;

cout

<< "

\n此程式的執行時間為

"<< totaltime << "秒!"

}getchar();

return0;

}

總結下這個執行緒池,主要是要注意鎖的防止位置,放太多,就變成單執行緒,執行效率還不如單執行緒,放太少,可能會造成多執行緒之間的誤讀,放的位置不對,會造成死鎖。。。是真的麻煩。

兩個想改進的地方,

一、希望可以在新增任務時確定任務的型別,而不是在thread_pool類中就確定task的型別,並且能支援傳入函式形參。

二、程式的優化做的不是很好吧,雖然不知道但是覺得肯定還有優化空間。

若有不足之處歡迎指出。

c 執行緒池的實現

github 傳送門 1.使用例項 測試job寫檔案 class job public wjob job job 1 void run endif 3.wthread 對wthread的封裝,主要在於將之與wjob繫結以完成任務,並與執行緒池繫結,在任務結束後將自己放回空閒佇列 每乙個執行緒都執行r...

執行緒池的c 實現

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

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

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