簡單的執行緒池

2021-09-24 05:26:53 字數 1887 閱讀 1158

執行緒池就是執行緒的一種使用模式。雖然執行緒是輕量級的程序,但是執行緒的建立和銷毀還是會引發效率問題。並且,如果建立的執行緒過多,反而會增加很多的排程開銷,影響系統效率。

執行緒池就是可以提前建立好一些執行緒,在我們需要使用執行緒的時候,對已經建立好的執行緒新增任務就好。

這裡我寫的這個執行緒池的原理如下:

#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...