執行緒池就是執行緒的一種使用模式。雖然執行緒是輕量級的程序,但是執行緒的建立和銷毀還是會引發效率問題。並且,如果建立的執行緒過多,反而會增加很多的排程開銷,影響系統效率。
執行緒池就是可以提前建立好一些執行緒,在我們需要使用執行緒的時候,對已經建立好的執行緒新增任務就好。
這裡我寫的這個執行緒池的原理如下:
#pragma once
#include
#include
#include
#include
// 用訊號量和環形陣列來實現阻塞佇列
// 訊號量表示可用資源個數
// 乙個訊號量表示當前佇列中元素的個數
// 另乙個訊號量表示當前佇列中空格的個數
// 插入元素就是在消耗乙個空格資源,釋放了乙個元素資源
// 刪除元素就是在消耗乙個元素資源,釋放了乙個空格資源
#include
template
<
class
t>
class
blockingqueue
virtual
~blockingqueue()
void
push
(const t& data)
void
pop(t* data)
private
: sem_t _lock;
std::vector _qu;
int _head;
int _tail;
int _size;
int _capicity;
sem_t _elem;
sem_t _blank;
};
#pragma once
#include
#include
"blockingqueue.hpp"
class
task
virtual
~task()
};// 執行緒池物件啟動的時候會建立一組執行緒
// 每個執行緒都會完成一定的任務(執行一定的**邏輯, 這個邏輯是由呼叫者來決定)
//// 任務是一段**,就可以用函式來表示
class
threadpool}~
threadpool()
for(size_t i =
0; i < wokers_.
size()
; i++)}
// 使用執行緒池的時候就需要由呼叫者加入一些任務
// 讓執行緒去執行
void
addtask
(task *task)
private
: blockingqueue> qu_;
int woker_;
std::vector wokers_;
private
:static
void
*threadentry
(void
*arg)
return
nullptr;}
};
#include
"threadpool.hpp"
// 這個類由使用者自己定製
// 需要依賴哪些資料,都可以隨意新增和修改
class
mytask
:public task
virtual
void
run(
)private
:int id_;};
intmain()
while(1
)return0;
}
這是乙個非常基礎的執行緒池,結構也比較簡單,也比較好懂。
叮~?
簡單的執行緒池
開始看執行緒池感覺十分懵逼,什麼任務,任務對列,不知道是什麼東西。但是在網上找了一篇注釋詳細一點的 仔細看看一遍,就慢慢清楚他大概是個什麼,大概是怎麼實現的。一邊看一遍加注釋,會幫助你理解。下面是我當時參考的一篇部落格,有乙個執行緒池 比較簡單清晰。include include include 鎖...
執行緒池的簡單認識
executor框架 執行緒池的幾種狀態 執行緒池原理 執行緒池儲存任務的queue 最大執行緒數 newfixedthreadpool linkedblockingqueue 使用者指定 newcachedthreadpool synchronousqueue integer.max value ...
執行緒池的簡單實用
c 執行緒池threadpool的用法 最近,因為做專案的關係,用到了很多和執行緒有關的東西。由於以前對執行緒只是有乙個概括的了解,並沒有深入的研究過,所以在面對一些問題時,總會感覺到有心無力,為此也花費了大量的時間和精力。為了鞏固這方面的知識,特寫此文章和大家分享。1 最簡單的執行緒例子 clas...