最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt線程池QThreadPool的使用詳解

 更新時間:2022年08月22日 08:37:00   作者:歐特克_Glodon  
本文主要介紹了Qt線程池QThreadPool的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、目的

  現(xiàn)在所有的高性能服務(wù)器程序,幾乎都會使用到線程池技術(shù),從而更好且有效的榨干服務(wù)器性能。而創(chuàng)建并銷毀線程的過程勢必會消耗內(nèi)存。而在日常開發(fā)中內(nèi)存資源是及其寶貴的,所以QT 多線程之線程池QThreadPool就有很大用處了。它可以用來管理線程的優(yōu)先順序,防止創(chuàng)建過多的線程,起到很好的管理作用。

二、最優(yōu)線程數(shù)

  線程的創(chuàng)建和銷毀是有性能開銷的,當我們有少量業(yè)務(wù)需要處理時,我們可以放到線程中完成,甚至可以多開幾個線程并行處理。
那么,問題來了,如果需要海量的數(shù)據(jù)處理,難道無休止的開線程下去嗎?

首先,要明白CPU的性能是有限的,每個線程好比一個處理時間片,多個線程之間切換處理,CPU線程上下文來回切換,這個也是需要消耗時間的。所以,物極必反,當線程數(shù)量到達一個點后,可能消耗在線程切換的時間,會大于實際線程處理業(yè)務(wù)的時間,這個可以想象的到。

那么很容易明白:線程數(shù)并不是越多越好,而是某個范圍或者某個經(jīng)驗值。

一般來講,我們可以認為,最佳性能線程數(shù)==CPU邏輯核心數(shù)量,比如CPU是4核8線程,那么開8個線程可以達到性能最佳。
一般電腦是開啟超線程的,也就是4核可以模擬出8個邏輯核,故稱4核8線程。
QThreadPool線程池默認最大線程數(shù),也是CPU邏輯Core的數(shù)量。
嚴格意義來講,最佳線程數(shù)還與處理業(yè)務(wù)類型有關(guān),如業(yè)務(wù)屬于IO密集型、CPU密集型,根據(jù)經(jīng)驗推斷:

  • IO密集型,頻繁讀取磁盤上的數(shù)據(jù),或者需要通過網(wǎng)絡(luò)遠程調(diào)用接口。線程數(shù)經(jīng)驗值是:2N,其中N代表CPU邏輯Core數(shù);
  • CPU密集型,非常復(fù)雜的調(diào)用,循環(huán)次數(shù)很多,或者遞歸調(diào)用層次很深等。線程數(shù)經(jīng)驗值是:N + 1,其中N代表CPU邏輯Core數(shù)。

三、線程池的原理

最佳性能線程數(shù)可以認為等于CPU邏輯核心數(shù)量N,所以我們設(shè)計程序,為了得到更好的性能,需要實現(xiàn)如下的需求:

  • 限制創(chuàng)建最大線程數(shù)量<=N;
  • 盡可能復(fù)用線程,避免頻繁創(chuàng)建和銷毀線程資源,降低無謂消耗;
  • 線程在空閑時,應(yīng)該休息,避免占用CPU資源;
  • 線程在有業(yè)務(wù)需要處理時,需要激活;
  • 當業(yè)務(wù)來了,這N個線程如何分配;

上述問題,高度封裝的QThreadPool線程池可以解決。

線程池的優(yōu)點:

  • 創(chuàng)建和銷毀線程需要和OS交互,少量線程影響不大,但是線程數(shù)量太大,勢必會影響性能,使用線程池可以這種開銷;
  • 線程池維護一定數(shù)量的線程,使用時,將指定函數(shù)傳遞給線程池,線程池會在線程中執(zhí)行任務(wù);
  • 線程池,屬于對象池,對象池都是為了復(fù)用,以避免頻繁申請和釋放對象所造成的性能損失。
  • 線程池創(chuàng)建好后,池內(nèi)默認一個線程也沒有,當通過相關(guān)函數(shù)加入任務(wù)后,線程池根據(jù)任務(wù)數(shù)量會自動創(chuàng)建線程,任務(wù)會合理分配到各個線程上執(zhí)行,但是線程總數(shù)量不會超過設(shè)定的最大值。
  • 若任務(wù)處理完畢,則池內(nèi)所有線程進入掛起狀態(tài),不占用CPU時間片,待任務(wù)再次到來,便會激活部分或全部線程,處理任務(wù)。
  • 若任務(wù)過多,當前沒有空閑的線程,則新增任務(wù)會被放置到緩存隊列中,等待線程空閑后,再進行處理,這樣,每個任務(wù)與線程可以有一個合理的分配,相當于實現(xiàn)了業(yè)務(wù)處理的負載均衡。故而可以以最好的性能來處理業(yè)務(wù)。

四、QThreadPool線程池

下面是QThreadPool的常用函數(shù):

int activeThreadCount() const //當前的活動線程數(shù)量
 
void clear()//清除所有當前排隊但未開始運行的任務(wù)
 
int expiryTimeout() const//線程長時間未使用將會自動退出節(jié)約資源,此函數(shù)返回等待時間
 
int maxThreadCount() const//線程池可維護的最大線程數(shù)量
 
void releaseThread()//釋放被保留的線程
 
void reserveThread()//保留線程,此線程將不會占用最大線程數(shù)量,從而可能會引起當前活動線程數(shù)量大于最大線程數(shù)量的情況
 
void setExpiryTimeout(int expiryTimeout)//設(shè)置線程回收的等待時間
 
void setMaxThreadCount(int maxThreadCount)//設(shè)置最大線程數(shù)量
 
void setStackSize(uint stackSize)//此屬性包含線程池工作線程的堆棧大小。
 
uint stackSize() const//堆大小
 
void start(QRunnable *runnable, int priority = 0)//加入一個運算到隊列,注意start不一定立刻啟動,只是插入到隊列,排到了才會開始運行。需要傳入QRunnable ,后續(xù)介紹
 
bool tryStart(QRunnable *runnable)//嘗試啟動一個
 
bool tryTake(QRunnable *runnable)//刪除隊列中的一個QRunnable,若當前QRunnable 未啟動則返回成功,正在運行則返回失敗
 
bool waitForDone(int?<i>msecs</i>?=?-1)//等待所有線程運行結(jié)束并退出,參數(shù)為等待時間-1表示一直等待到最后一個線程退出

QRunnable類:所有runable對象的基類。
QRunnable類是一個接口, 用于表示需要執(zhí)行的任務(wù)或代碼段, 具體任務(wù)在run() 函數(shù)內(nèi)部實現(xiàn)。可以使用QThreadPool在各個獨立的線程中執(zhí)行代碼。如果autoDelete() 返回true (默認值), QThreadPool將自動刪除QRunnable 。使用setAutoDelete() 可更改是否自動刪除。
QThreadPool 是創(chuàng)建線程池函數(shù),QRunnable是線程池的線程具體執(zhí)行操作函數(shù),兩者要搭配使用。

五、QThreadPool簡單示例

執(zhí)行效果如下:

#include <QCoreApplication>
#include <QThreadPool>
#include <QDebug>

class Task1 : public QRunnable
{
public:
    Task1()
    { }
    virtual ~Task1() override
    {
        qDebug() << "~Task1()";
    }

    virtual void run() override
    {
        qDebug() << "do Task1 work:" << QThread::currentThreadId();
    }
};

class Task2 : public QRunnable
{
public:
    Task2()
    { }
    virtual ~Task2() override
    {
        qDebug() << "~Task2()";
    }

    virtual void run() override
    {
        qDebug() << "do Task2 work:" << QThread::currentThreadId();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Task1* task1 = new Task1();
    Task2* task2 = new Task2();

    QThreadPool threadPool;
    threadPool.start(task1);
    threadPool.start(task2);
    threadPool.waitForDone();

    return a.exec();
}

注意:
線程池使用時傳入繼承于的QRunnable類對象(并啟動該線程對象),并且線程池會自主釋放在其中的線程(提高程序性能),還能實現(xiàn)并發(fā),提高效率;不過不能使用信號槽進行通信,需要使用QMetaObject::invokeMethod進行通信。

到此這篇關(guān)于Qt線程池QThreadPool的使用詳解的文章就介紹到這了,更多相關(guān)Qt線程池QThreadPool內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言/C++中如何產(chǎn)生隨機數(shù)

    C語言/C++中如何產(chǎn)生隨機數(shù)

    這里要用到的是rand()函數(shù), srand()函數(shù),和time()函數(shù)。需要說明的是,iostream頭文件中就有srand函數(shù)的定義,不需要再額外引入stdlib.h;而使用time()函數(shù)需要引入ctime頭文件
    2013-10-10
  • 解析c++ 中智能指針引用計數(shù)為什么不是0原理

    解析c++ 中智能指針引用計數(shù)為什么不是0原理

    這篇文章主要為大家介紹了C語言中智能指針引用計數(shù)為什么不是0原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • C/C++中的static關(guān)鍵字詳解

    C/C++中的static關(guān)鍵字詳解

    這篇文章主要為大家詳細介紹了 C/C++中的static關(guān)鍵字,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言光標旋轉(zhuǎn)與倒計時功能實現(xiàn)示例詳解

    C語言光標旋轉(zhuǎn)與倒計時功能實現(xiàn)示例詳解

    這篇文章主要為大家介紹了C語言實現(xiàn)光標旋轉(zhuǎn)與倒計時功能的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • C語言全面講解順序表使用操作

    C語言全面講解順序表使用操作

    線性表是最簡單的數(shù)據(jù)結(jié)構(gòu),而順序表又是最簡單的線性表,其基本思想是用一段地址連續(xù)的儲存單元依次存儲線性表的數(shù)據(jù)元素,比如我們常用的一維數(shù)組,下面代碼實現(xiàn)了順序表的定義以及基本操作
    2022-04-04
  • C語言各種變量的初始化方式

    C語言各種變量的初始化方式

    這篇文章主要介紹了C語言各種變量的初始化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)

    這篇文章主要介紹了C語言中如何在結(jié)構(gòu)體內(nèi)定義函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言實現(xiàn)學(xué)生選修課程系統(tǒng)設(shè)計

    C語言實現(xiàn)學(xué)生選修課程系統(tǒng)設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生選修課程系統(tǒng)設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Qt 實現(xiàn)桌面雪花飄落代碼

    Qt 實現(xiàn)桌面雪花飄落代碼

    這篇文章主要介紹了Qt實現(xiàn)桌面雪花飄落代碼,有需要的朋友可以參考一下
    2013-12-12
  • C語言實現(xiàn)求梅森素數(shù)的代碼與解析

    C語言實現(xiàn)求梅森素數(shù)的代碼與解析

    這篇文章主要給大家介紹了關(guān)于利用C語言實現(xiàn)求梅森素數(shù)的代碼與解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評論

嘉峪关市| 德兴市| 民县| 思茅市| 来凤县| 盱眙县| 鲁甸县| 玛曲县| 福海县| 固始县| 白水县| 藁城市| 凯里市| 金华市| 巴楚县| 昌黎县| 长宁县| 腾冲县| 手游| 嘉祥县| 张家口市| 申扎县| 武城县| 太和县| 乾安县| 溆浦县| 确山县| 江都市| 武陟县| 吉林市| 固原市| 来凤县| 水富县| 萨迦县| 诸城市| 清镇市| 双鸭山市| 和硕县| 铅山县| 什邡市| 行唐县|