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

C/C++ Qt QThread線程組件的具體使用

 更新時間:2021年11月25日 16:36:09   作者:lyshark  
QThread庫是QT中提供的跨平臺多線程實現(xiàn)方案,本文詳細的介紹了Qt QThread線程組件的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

QThread庫是QT中提供的跨平臺多線程實現(xiàn)方案,使用時需要繼承QThread這個基類,并重寫實現(xiàn)內(nèi)部的Run方法,由于該庫是基本庫,默認依賴于QtCore.dll這個基礎模塊,在使用時無需引入其他模塊.

實現(xiàn)簡單多線程

QThread庫提供了跨平臺的多線程管理方案,通常一個QThread對象管理一個線程,在使用是需要從QThread類繼承并重寫內(nèi)部的Run方法,并在Run方法內(nèi)部實現(xiàn)多線程代碼.

#include <QCoreApplication>
#include <iostream>
#include <QThread>

class MyThread: public QThread
{

protected:
    volatile bool m_to_stop;

protected:
    // 線程函數(shù)必須使用Run作為開始
    void run()
    {
        for(int x=0; !m_to_stop && (x <10); x++)
        {
            msleep(1000);
            std::cout << objectName().toStdString() << std::endl;
        }
    }

public:
    MyThread()
    {
        m_to_stop = false;
    }

    // 用于設置結束符號為真
    void stop()
    {
        m_to_stop = true;
    }

    // 輸出線程運行狀態(tài)
    void is_run()
    {
        std::cout << "Thread Running = " << isRunning() << std::endl;
    }

    // 輸出線程完成狀態(tài)(是否結束)
    void is_finish()
    {
        std::cout << "Thread Finished = " << isFinished() << std::endl;
    }

};

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

    // 定義線程數(shù)組
    MyThread thread[10];

    // 設置線程對象名字
    for(int x=0;x<10;x++)
    {
        thread[x].setObjectName(QString("thread => %1").arg(x));
    }

    // 批量調(diào)用run執(zhí)行
    for(int x=0;x<10;x++)
    {
        thread[x].start();
        thread[x].is_run();
        thread[x].isFinished();
    }

    // 批量調(diào)用stop關閉
    for(int x=0;x<10;x++)
    {
        thread[x].wait();
        thread[x].stop();

        thread[x].is_run();
        thread[x].is_finish();
    }

    return a.exec();
}

向線程中傳遞參數(shù)

線程在執(zhí)行前可以通過調(diào)用MyThread中的自定義函數(shù),并在函數(shù)內(nèi)實現(xiàn)參數(shù)賦值,實現(xiàn)線程傳參操作.

#include <QCoreApplication>
#include <iostream>
#include <QThread>

class MyThread: public QThread
{
protected:
    int m_begin;
    int m_end;
    int m_result;

    void run()
    {
        m_result = m_begin + m_end;
    }

public:
    MyThread()
    {
        m_begin = 0;
        m_end = 0;
        m_result = 0;
    }

    // 設置參數(shù)給當前線程
    void set_value(int x,int y)
    {
        m_begin = x;
        m_end = y;
    }

    // 獲取當前線程名
    void get_object_name()
    {
        std::cout << "this thread name => " << objectName().toStdString() << std::endl;
    }

    // 獲取線程返回結果
    int result()
    {
        return m_result;
    }
};

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

    MyThread thread[3];

    // 分別將不同的參數(shù)傳入到線程函數(shù)內(nèi)
    for(int x=0; x<3; x++)
    {
        thread[x].set_value(1,2);
        thread[x].setObjectName(QString("thread -> %1").arg(x));
        thread[x].start();
    }

    // 等待所有線程執(zhí)行結束
    for(int x=0; x<3; x++)
    {
        thread[x].get_object_name();
        thread[x].wait();
    }

    // 獲取線程返回值并相加
    int result = thread[0].result() + thread[1].result() + thread[2].result();
    std::cout << "sum => " << result << std::endl;

    return a.exec();
}

QMutex 互斥同步線程鎖

QMutex類是基于互斥量的線程同步鎖,該鎖lock()鎖定與unlock()解鎖必須配對使用,線程鎖保證線程間的互斥,利用線程鎖能夠保證臨界資源的安全性.

  • 線程鎖解決的問題: 多個線程同時操作同一個全局變量,為了防止資源的無序覆蓋現(xiàn)象,從而需要增加鎖,來實現(xiàn)多線程搶占資源時可以有序執(zhí)行.
  • 臨界資源(Critical Resource): 每次只允許一個線程進行訪問 (讀/寫)的資源.
  • 線程間的互斥(競爭): 多個線程在同一時刻都需要訪問臨界資源.
  • 一般性原則: 每一個臨界資源都需要一個線程鎖進行保護.
#include <QCoreApplication>
#include <iostream>
#include <QThread>
#include <QMutex>

static QMutex g_mutex;      // 線程鎖
static QString g_store;     // 定義全局變量

class Producer : public QThread
{
protected:
    void run()
    {
        int count = 0;

        while(true)
        {
            // 加鎖
            g_mutex.lock();

            g_store.append(QString::number((count++) % 10));
            std::cout << "Producer -> "<< g_store.toStdString() << std::endl;

            // 釋放鎖
            g_mutex.unlock();
            msleep(900);
        }
    }
};

class Customer : public QThread
{
protected:
    void run()
    {
        while( true )
        {
            g_mutex.lock();
            if( g_store != "" )
            {
                g_store.remove(0, 1);
                std::cout << "Curstomer -> "<< g_store.toStdString() << std::endl;
            }

            g_mutex.unlock();
            msleep(1000);
        }
    }
};

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

    Producer p;
    Customer c;

    p.setObjectName("producer");
    c.setObjectName("curstomer");

    p.start();
    c.start();

    return a.exec();
}

QMutexLocker是在QMutex基礎上簡化版的線程鎖,QMutexLocker會保護加鎖區(qū)域,并自動實現(xiàn)互斥量的鎖定和解鎖操作,可以將其理解為是智能版的QMutex鎖,該鎖只需要在上方代碼中稍加修改即可.

#include <QMutex>
#include <QMutexLocker>

static QMutex g_mutex;      // 線程鎖
static QString g_store;     // 定義全局變量

class Producer : public QThread
{
protected:
    void run()
    {
        int count = 0;

        while(true)
        {
			// 增加智能線程鎖
            QMutexLocker Locker(&g_mutex);

            g_store.append(QString::number((count++) % 10));
            std::cout << "Producer -> "<< g_store.toStdString() << std::endl;

            msleep(900);
        }
    }
};

互斥鎖存在一個問題,每次只能有一個線程獲得互斥量的權限,如果在程序中有多個線程來同時讀取某個變量,那么使用互斥量必須排隊,效率上會大打折扣,基于QReadWriteLock讀寫模式進行代碼段鎖定,即可解決互斥鎖存在的問題.

QReadWriteLock 讀寫同步線程鎖

該鎖允許用戶以同步讀lockForRead()或同步寫lockForWrite()兩種方式實現(xiàn)保護資源,但只要有一個線程在以寫的方式操作資源,其他線程也會等待寫入操作結束后才可繼續(xù)讀資源.

#include <QCoreApplication>
#include <iostream>
#include <QThread>
#include <QMutex>
#include <QReadWriteLock>

static QReadWriteLock g_mutex;      // 線程鎖
static QString g_store;             // 定義全局變量

class Producer : public QThread
{
protected:
    void run()
    {
        int count = 0;

        while(true)
        {
            // 以寫入方式鎖定資源
            g_mutex.lockForWrite();

            g_store.append(QString::number((count++) % 10));

            // 寫入后解鎖資源
            g_mutex.unlock();

            msleep(900);
        }
    }
};

class Customer : public QThread
{
protected:
    void run()
    {
        while( true )
        {
            // 以讀取方式寫入資源
            g_mutex.lockForRead();
            if( g_store != "" )
            {
                std::cout << "Curstomer -> "<< g_store.toStdString() << std::endl;
            }

            // 讀取到后解鎖資源
            g_mutex.unlock();
            msleep(1000);
        }
    }
};

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

    Producer p1,p2;
    Customer c1,c2;

    p1.setObjectName("producer 1");
    p2.setObjectName("producer 2");

    c1.setObjectName("curstomer 1");
    c2.setObjectName("curstomer 2");

    p1.start();
    p2.start();

    c1.start();
    c2.start();

    return a.exec();
}

QSemaphore 基于信號線程鎖

信號量是特殊的線程鎖,信號量允許N個線程同時訪問臨界資源,通過acquire()獲取到指定資源,release()釋放指定資源.

#include <QCoreApplication>
#include <iostream>
#include <QThread>
#include <QSemaphore>

const int SIZE = 5;
unsigned char g_buff[SIZE] = {0};

QSemaphore g_sem_free(SIZE); // 5個可生產(chǎn)資源
QSemaphore g_sem_used(0);    // 0個可消費資源

// 生產(chǎn)者生產(chǎn)產(chǎn)品
class Producer : public QThread
{
protected:
    void run()
    {
        while( true )
        {
            int value = qrand() % 256;

            // 若無法獲得可生產(chǎn)資源,阻塞在這里
            g_sem_free.acquire();

            for(int i=0; i<SIZE; i++)
            {
                if( !g_buff[i] )
                {
                    g_buff[i] = value;
                    std::cout << objectName().toStdString() << " --> " << value << std::endl;
                    break;
                }
            }

            // 可消費資源數(shù)+1
            g_sem_used.release();

            sleep(2);
        }
    }
};

// 消費者消費產(chǎn)品
class Customer : public QThread
{
protected:
    void run()
    {
        while( true )
        {
            // 若無法獲得可消費資源,阻塞在這里
            g_sem_used.acquire();

            for(int i=0; i<SIZE; i++)
            {
                if( g_buff[i] )
                {
                    int value = g_buff[i];

                    g_buff[i] = 0;
                    std::cout << objectName().toStdString() << " --> " << value << std::endl;
                    break;
                }
            }

            // 可生產(chǎn)資源數(shù)+1
            g_sem_free.release();

            sleep(1);
        }
    }
};

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

    Producer p1;
    Customer c1;

    p1.setObjectName("producer");
    c1.setObjectName("curstomer");

    p1.start();
    c1.start();

    return a.exec();
}

到此這篇關于C/C++ Qt QThread線程組件的具體使用的文章就介紹到這了,更多相關Qt QThread線程使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言 坐標移動詳解及實例代碼

    C語言 坐標移動詳解及實例代碼

    這篇文章主要介紹了C語言 坐標移動詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-01-01
  • 詳解C++引用變量時那些你不知道的東西

    詳解C++引用變量時那些你不知道的東西

    這篇文章主要為大家詳細介紹了C++引用變量時那些你不知道的東西——引用變量延遲綁定,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-11-11
  • 算法學習入門之使用C語言實現(xiàn)各大基本的排序算法

    算法學習入門之使用C語言實現(xiàn)各大基本的排序算法

    這篇文章主要介紹了使用C語言實現(xiàn)各大基本的排序算法的方法,同時也對算法的選擇問題上給出了一些建議,的朋友可以參考下
    2015-12-12
  • C++中的Lambda函數(shù)詳解

    C++中的Lambda函數(shù)詳解

    大家好,本篇文章主要講的是C++中的Lambda函數(shù)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++ Boost PropertyTree示例超詳細講解

    C++ Boost PropertyTree示例超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++ 數(shù)據(jù)結構完全二叉樹的判斷

    C++ 數(shù)據(jù)結構完全二叉樹的判斷

    這篇文章主要介紹了C++ 數(shù)據(jù)結構完全二叉樹的判斷的相關資料,需要的朋友可以參考下
    2017-06-06
  • C++插入排序算法實例

    C++插入排序算法實例

    這篇文章主要介紹了C++插入排序算法實例,本文先是講解了什么插入排序,然后給出了C++代碼實例,需要的朋友可以參考下
    2014-10-10
  • C語言實現(xiàn)制作通訊錄(新手推薦)

    C語言實現(xiàn)制作通訊錄(新手推薦)

    本文推薦給C語言學習到結構體的新手們,供其練習。這篇文章主要是利用C語言制作一個簡單的通訊錄功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • C++數(shù)據(jù)結構與算法的基礎知識和經(jīng)典算法匯總

    C++數(shù)據(jù)結構與算法的基礎知識和經(jīng)典算法匯總

    終是到了標志著大二結束的期末考試了,對于《算法設計與分析》這門課,我需要總結一下學過的所有算法的思想以及老師補充的關于兩個復雜度和遞歸的概念思想,以及更深層次的理解,比如用畫圖的方式表達出來,我覺得可以用博客記錄總結一下,分享給大家,希望能有所幫助
    2022-05-05
  • 利用C語言實現(xiàn)HashTable

    利用C語言實現(xiàn)HashTable

    根據(jù)KEY從hashtable中獲取接點,步驟是先根據(jù)KEY計算hash值,然后從hashtable中找到指定的接點或者接點鏈表
    2013-09-09

最新評論

武川县| 德兴市| 同江市| 会同县| 木里| 浦东新区| 新化县| 巢湖市| 民权县| 孝感市| 九龙县| 南安市| 科技| 阿瓦提县| 连州市| 上思县| 阳城县| 康保县| 五华县| 壶关县| 江永县| 高雄市| 开远市| 大连市| 巴塘县| 二手房| 于都县| 汉沽区| 莱州市| 南溪县| 亳州市| 饶平县| 尼木县| 韶山市| 杭锦旗| 凤冈县| 寻甸| 洛阳市| 天镇县| 潮安县| 康乐县|