Tars原始碼分析 執行緒池實現

2021-08-20 22:33:58 字數 1943 閱讀 1766

總結

前言tars底層實現了乙個執行緒池庫,主要源**位於tc_thread_poo.(cpp,h)檔案中。執行緒池佇列涉及的核心是工作執行緒和任務佇列的設計。本文基於tars中的實現進行介紹。

tc_thread

執行緒池的工作執行緒類(threadworker)繼承自tc_thread,它是tars實現的執行緒類,實現原理是基於c++的pthread_create函式。外部使用者通過呼叫tc_thread的start函式來啟動執行緒,新執行緒的入口為threadentry函式,該函式會呼叫tc_thread的run函式。run函式是具體的執行緒執行邏輯,它是乙個虛函式

virtual

void run() = 0;

因此子類可以通過實現這個函式來控制線程的執行邏輯。我們下面我們根據threadworker實現的run函式來看執行緒池中的執行緒的執行邏輯。

threadworker

void tc_threadpool::threadworker::run()

catch ( ... )

delete pst;

pst = null;

}//呼叫處理部分

while (!_bterminate)

catch ( ... )

_tpool->idle(this);}}

//結束

_tpool->exit();

}

這裡的任務是以仿函式物件的形式存在的,這樣就可以使得執行緒不必關心任務的具體實現邏輯,只需要直接呼叫仿函式即可。下面我們介紹一下執行緒池的實現,以及對外提供的介面。

tc_threadpool

tc_threadpool主要維護以下幾個成員資料:

/**

* 任務佇列

*//**

* 啟動任務

*//**

* 工作執行緒

*/std::vector_jobthread;

/*** 繁忙執行緒

*/std::set_busthread;

/*** 任務佇列的鎖

*/tc_threadlock _tmutex;

/*** 是否所有任務都執行完畢

*/bool _balldone;

_jobqueue是任務佇列,使用者通過呼叫執行緒池的exec介面向任務佇列中新增任務

_startqueue是中放的是執行緒啟動初始化邏輯。帶參start函式負責設定這個佇列:

從這個函式的實現可以看到,每個執行緒的初始化邏輯是一樣的。

_jobthread和_busthread是放置執行緒物件的集合,其中_busthread中存放正在執行任務的執行緒。

最後,_tmutex是任務鎖,_balldone是乙個狀態變數。

tc_threadqueue

執行緒池中的執行緒在操作tc_threadqueue時並沒有加鎖,這是因為它是乙個執行緒安全的佇列。它底層資料儲存結構是deque。

tc_threadqueue的執行緒安全性得益於它繼承了tc_threadlock類:

typedef tc_monitortc_threadcond> tc_threadlock;
該類提供了互斥鎖和條件變數來保證多併發操作的安全。通過在tc_threadqueue涉及併發競爭問題的操作函式中呼叫tc_threadlock提供的相關操作介面,就可以保證tc_threadqueue相應操作函式的執行緒安全性。

總結本文以執行緒池的實現為入口,分別介紹了tars中實現的執行緒類,執行緒鎖,以及基於執行緒鎖的執行緒安全物件。所有需要執行緒安全的物件都可以通過繼承tc_threadlock基類,然後運用tc_threadlock提供的操作函式達到物件的成員資料訪問操作的併發安全(當然,這是由於tc_threadlock中內建了互斥鎖和條件變數)。

muduo原始碼分析執行緒池

執行緒池的實現原理 在併發程式設計中,由於執行緒的反覆建立於銷毀是非常消耗時間的,在存在大量的執行緒的建立於銷毀的程式中,我們可以事先建立出一部分執行緒,然後管理這些執行緒去處理我們的任務,這樣可以節省一大部分反覆建立與銷毀的時間開銷,執行緒池的好處這裡不多說了,看一下muduo 網路庫對執行緒池的...

android 執行緒池原始碼分析

一直覺得這塊比較複雜,原因在於需要對資料結構和多執行緒開發比較熟悉。現在從threadpoolexecutor 出發。先看這個建構函式。public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,...

mysql 執行緒池原始碼 執行緒池原始碼解析

1.前言 我個人覺得理論性的東西可能大家都懂,但是具體的實現細節可能並不是很清楚所以才想記錄一下,加深記憶。2.關鍵原始碼解析 1 ctl private final atomicinteger ctl new atomicinteger ctlof running,0 private static...