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

Qt中互斥鎖QMutex和QMutexLocker的使用

 更新時(shí)間:2023年05月24日 08:36:07   作者:小瑞的學(xué)習(xí)筆記  
本文主要介紹了Qt中互斥鎖QMutex和QMutexLocker的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

QMutex和QMutexLocker

類 QMutex 的主要函數(shù)有:

  • lock (); 加鎖,如果該互斥鎖被占用,該函數(shù)阻塞,直到互斥鎖被釋放。
  • unlock ();
  • 解鎖bool tryLock (int timeout = 0);

表示嘗試去加鎖,timeout 為超時(shí)時(shí)間。如果互斥鎖為可用狀態(tài),該函數(shù)會(huì)占用該互斥鎖,并返回 true ,否則返回 false 。如果互斥鎖被另一個(gè)線程占用,該函數(shù)會(huì)等待 timeout 毫秒直到互斥鎖為可用狀態(tài)。

QMutexLocker 類的主要作用是用來(lái)管理 QMutex使用 QMutexLocker 的好處是,可以防止線程死鎖。該對(duì)象在構(gòu)造的時(shí)候加鎖,析構(gòu)的時(shí)候解鎖。

使用場(chǎng)景

QMutex目的是保護(hù)一次只有一個(gè)線程訪問(wèn)一個(gè)對(duì)象、數(shù)據(jù)結(jié)構(gòu)或一段代碼。QMutex通常在較為簡(jiǎn)單的代碼中使用,如果代碼復(fù)雜最好使用【QMutexLocker+互斥鎖】進(jìn)行多線程同步,這樣可以很容易確保鎖定和解鎖操作執(zhí)行一致。

? - 在復(fù)雜函數(shù)和語(yǔ)句或異常處理代碼中l(wèi)ock和unlock QMutex很容易出錯(cuò),而且很難調(diào)試。在這種情況下,可以使用QMutexLocker替代。

  • ? QMutexLocker在一個(gè)需要鎖定QMutex的函數(shù)中創(chuàng)建。當(dāng)創(chuàng)建QMutexLocker時(shí),互斥鎖被鎖定(后面可以使用unlock()和relock()對(duì)互斥鎖進(jìn)行解鎖和重新鎖定)。如果互斥鎖鎖定了,互斥對(duì)象將在QMutexLocker銷毀時(shí)被解鎖。
  • 即QMutexLocker創(chuàng)建時(shí)鎖定,銷毀時(shí)解鎖,所以一般為局部變量

QMutex

預(yù)期:兩個(gè)線程使用一把鎖,操作一個(gè)數(shù)據(jù),數(shù)據(jù)會(huì)被兩個(gè)線程依次打印1.2.3.4…

MyThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QMutex>
class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    void run();
private:
    static QMutex mutex;  // 多個(gè)線程使用一把鎖
    static int num;       // 多個(gè)線程訪問(wèn)一個(gè)數(shù)據(jù)
};
#endif // MYTHREAD_H

MyThread.cpp

#include "mythread.h"
#include <QDebug>
QMutex MyThread::mutex;
int MyThread::num = 0;
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
    while (1) {
        this->mutex.lock();// 加鎖
        qDebug() << "Current Thread: " << this
                  << ", Value: " << this->num++;
        this->mutex.unlock();// 解鎖
        QThread::sleep(1);// 線程睡眠兩秒
    }
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPainter>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include <QDebug>
#include <QLabel>
#include <QFileInfo>
#include <QPushButton>
#include <QHBoxLayout>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MyThread *myThread1 = new MyThread(this);
    MyThread *myThread2 = new MyThread(this);
    myThread1->start();
    myThread2->start();
}
MainWindow::~MainWindow()
{
    delete ui;
}

運(yùn)行結(jié)果:

QMutexLocker

預(yù)期:兩個(gè)線程使用一把鎖,操作一個(gè)數(shù)據(jù),數(shù)據(jù)會(huì)被兩個(gè)線程依次打印1.2.3.4…

這里只改變了MyThread.cpp

MyThread.cpp

#include "mythread.h"
#include <QDebug>
#include <QMutexLocker>
QMutex MyThread::mutex;
int MyThread::num = 0;
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
    while (1) {
        // QMutexLocker:創(chuàng)建的時(shí)候加鎖,當(dāng)QMutexLocker局部銷毀的時(shí)候解鎖
        {
            QMutexLocker lock(&this->mutex);
            qDebug() << "Current Thread: " << this
                      << ", Value: " << this->num++;
        }
        QThread::sleep(1);// 線程睡眠兩秒
    }
}

運(yùn)行結(jié)果:

到此這篇關(guān)于Qt中互斥鎖QMutex和QMutexLocker的使用的文章就介紹到這了,更多相關(guān)Qt 互斥鎖 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言一個(gè)函數(shù)如何實(shí)現(xiàn)好幾個(gè)return返回值

    C語(yǔ)言一個(gè)函數(shù)如何實(shí)現(xiàn)好幾個(gè)return返回值

    本文主要介紹了C語(yǔ)言一個(gè)函數(shù)如何實(shí)現(xiàn)好幾個(gè)return返回值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Qt使用Json的項(xiàng)目實(shí)踐

    Qt使用Json的項(xiàng)目實(shí)踐

    JSON是一種對(duì)源自Javascript的對(duì)象數(shù)據(jù)進(jìn)行編碼的格式,但現(xiàn)在被廣泛用作互聯(lián)網(wǎng)上的數(shù)據(jù)交換格式,本文主要介紹了Qt使用Json的項(xiàng)目實(shí)踐,詳細(xì)的介紹了主要使用的類以及Json實(shí)戰(zhàn),感興趣的可以了解一下
    2023-09-09
  • C語(yǔ)言中while與do-while的介紹與注意事項(xiàng)

    C語(yǔ)言中while與do-while的介紹與注意事項(xiàng)

    對(duì)于C語(yǔ)言中的while與do-while,相信很多都再熟悉不過(guò)了,最近在工作中就用到了,所以想著總結(jié)一下,方便自己或者有需要的朋友們參考借鑒,文中通過(guò)示例代碼介紹的很詳細(xì),感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-10-10
  • C語(yǔ)言中函數(shù)返回值不一致問(wèn)題

    C語(yǔ)言中函數(shù)返回值不一致問(wèn)題

    這篇文章主要介紹了C語(yǔ)言中函數(shù)返回值不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    今天小編就為大家分享一篇關(guān)于C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)

    C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    這篇文章主要介紹了C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中動(dòng)態(tài)分配實(shí)現(xiàn)串的實(shí)例,需要的朋友可以參考下
    2017-10-10
  • C++之std::vector刪除元素的幾種方式及區(qū)別說(shuō)明

    C++之std::vector刪除元素的幾種方式及區(qū)別說(shuō)明

    這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

广宁县| 安达市| 青铜峡市| 郎溪县| 穆棱市| 宁晋县| 绵竹市| 酒泉市| 仪征市| 西昌市| 乐至县| 百色市| 通渭县| 遂昌县| 浦城县| 泽普县| 四会市| 莎车县| 连山| 文山县| 龙陵县| 黄石市| 南安市| 吉水县| 依兰县| 桦南县| 池州市| 曲周县| 宣化县| 彭阳县| 乐业县| 抚宁县| 连城县| 曲麻莱县| 湖州市| 玉龙| 霞浦县| 金湖县| 深圳市| 寻甸| 苏尼特右旗|