執行緒池的研究

2021-09-08 13:20:05 字數 1246 閱讀 5321

原文: 

這篇非常好哦,是對libthreadpool的改進!!   

一、"知其然,不知其所以然"

因為工作需要,用到了執行緒池。用的並不是自己寫的,而是人家實現的執行緒池(windows庫檔案),使用起來也挺簡單。工作嘛,完成任務放在第一位,就沒再對其深究,能用就好。

二、"只知其一不知其二"

同樣應為工作需要,程式需要從windows移植到linux下,執行緒池需要自己編寫。於是在網上找資料。實現的原始碼一大片,方式風格各異,但就是沒找到乙個講整個流程的,以及關鍵點。

了解到的資料大致如下:1、提前建立一定數量的工作執行緒;2、在需要時喚醒乙個執行緒。還有人提到:需要通過修改已建立的工作執行緒的入口位址,從而執行自己需要的執行的函式。聽起來倒是很有道理,就沒太在意。感覺實現執行緒池非常簡單嘛。於是打算開始寫**。

三、"掌握核心科技"

完全自己寫**,沒有一點頭緒。找來兩個原始碼,"借鑑"一下。乙個叫libthreadpool,在sourceforge.net上能找到;另乙個叫tpool,在一篇叫什麼《200行...c執行緒池...》的文章上找到(不好意思,記不太清楚了)。參考兩個原始碼開始自己動手寫。

1、建立乙個結構體,儲存執行緒池的相關資訊;

1)、原始碼都用了條件鎖(pthread_cond_t)和互斥鎖(pthread_mutex_t),而且數量不一樣。不知何用,暫時放到一邊。

2)、tpool用到鍊錶來管理執行緒,libthreadpool用陣列方式。方式不重要,暫時放到一邊。

3)、乙個字"亂",整個結構體放到一邊。

2、初始化函式

1)、主體:乙個for迴圈換開啟n個工作執行緒;其他暫不知還需要什麼,先寫工作執行緒函式。

2)、工作執行緒函式?需要幹什麼?如何修改入口位址?

一連串的問題,只好認真分析原始碼。這才恍然大悟,原來執行緒池的關鍵是工作執行緒。在工作執行緒執行乙個死迴圈,在死迴圈中呼叫指標指向的函式(你最終要執行的執行緒函式)。這樣在工作執行緒的一次迴圈中,就執行了你的執行緒函式。下次迴圈掛起,等待新的任務。原來修改入口位址的真正含義是修改工作執行緒的死迴圈中呼叫函式的指標,指向要執行的執行緒函式。

總算弄明白了執行緒池是如何實現的。現在拋開人家的原始碼,完全自己實現乙個執行緒池。

四、"從零開始"

1、理解cond作用,執行緒池裡必須用到。目的是多個閒置執行緒阻塞,等待任務。

構建結構體

也是對libthreadpool的改進

python 執行緒池 Python的執行緒池

usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...