寫了乙個簡易執行緒池,
原理簡單介紹下,就是設定乙個任務佇列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...