Qt執行緒池QThreadPool原始碼學習筆記

2021-10-07 14:18:44 字數 1326 閱讀 8324

qlistallthreads; //所有執行緒

qqueuewaitingthreads; //等待佇列,當乙個執行緒中完成它的工作後,如果發現現有正在工作的執行緒數沒有超過設定上限數量,放到這裡,執行緒等待一定的時間,如果超時了,將這個執行緒放到expiredthreads

qqueueexpiredthreads; //到期佇列,當乙個執行緒中完成它的工作後,如果發現現有正在工作的執行緒數超過設定上限數量,將執行緒停止,放到這裡

queuepage //相同優先順序qrunnable的佇列

qthreadpool::start(qrunnable *runnable, int priority); //執行緒池新增qrunnable的邏輯是:

池中線程數量為0:建立執行緒,新增到allthreads中,並開始工作

池中線程數量不為0:

2.1 當前工作中的執行緒數超出了允許的最大值,將任務qrunnable加入任務佇列,如果等待佇列不為空,嘗試喚醒佇列頭部的執行緒

2.2 當前工作中的執行緒數沒有超出允許的最大值。如果有等待執行緒,則將任務qrunnable加入任務佇列,並喚醒佇列頭部的執行緒。如果沒有等待執行緒,則從到期執行緒中取出乙個,將這項任務交給他,並開始工作。

執行緒池處理工作的優先順序功能:

在加入工作qrunnable時有乙個可選引數priority,它的值預設為0。start(qrunnable *runnable, int priority);

這項任務會新增到任務列表中qvectorqueue;,新增時根據優先順序值進行排序,數值小的在前,優先處理。

for

(queuepage *page :

qasconst

(queue))}

auto it = std::

upper_bound

(queue.

constbegin()

, queue.

constend()

, priority, comparepriority)

; queue.

insert

(std::

distance

(queue.

constbegin()

, it)

,new

queuepage

(runnable, priority)

);

QT 執行緒池

在程式邏輯中經常會碰到需要處理大批量任務的情況,比如密集的網路請求,或者日誌分析等等。一般會建立乙個佇列,用乙個或者多個執行緒去消費這個佇列,一般也要處理佇列的加鎖和解鎖的問題,除非在設計時就能夠做到專列專用,否則鎖是不可避免的。而且在入隊和出隊的操作上肯定還是要加鎖,因為他們是在不同執行緒對同乙個...

Qt的執行緒池QThreadPool

執行緒可以幫助我們處理耗時的操作以防止介面卡死,也可以提高程式的併發性。但執行緒也不是建立越多越好,因為建立 銷毀執行緒以及切換執行緒都是需要消耗資源的。執行緒池技術的出現就是為了解決這個問題。執行緒池維護一定數量的執行緒,並充分使用它們。qt封裝的執行緒池類是qthreadpool,它的使用需要q...

qt執行緒,執行緒池用到的一點問題

總結一下最近使用qt多執行緒和執行緒池遇到的一些問題。1.qthreadpool 執行緒池的作用是什麼呢?把多個執行緒丟個乙個執行緒池中,讓他對目前的執行緒進行管理。比如最大執行的執行緒數,以及最大執行緒數外的執行緒就處於等待狀態等。要放到執行緒池中的執行緒必須繼承自qrunable類,這個類有個缺...