C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt 互斥锁

Qt中互斥锁QMutex和QMutexLocker的使用

作者:小瑞的学习笔记

本文主要介绍了Qt中互斥锁QMutex和QMutexLocker的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

QMutex和QMutexLocker

类 QMutex 的主要函数有:

表示尝试去加锁,timeout 为超时时间。如果互斥锁为可用状态,该函数会占用该互斥锁,并返回 true ,否则返回 false 。如果互斥锁被另一个线程占用,该函数会等待 timeout 毫秒直到互斥锁为可用状态。

QMutexLocker 类的主要作用是用来管理 QMutex使用 QMutexLocker 的好处是,可以防止线程死锁。该对象在构造的时候加锁,析构的时候解锁。

使用场景

QMutex目的是保护一次只有一个线程访问一个对象、数据结构或一段代码。QMutex通常在较为简单的代码中使用,如果代码复杂最好使用【QMutexLocker+互斥锁】进行多线程同步,这样可以很容易确保锁定和解锁操作执行一致。

​ - 在复杂函数和语句或异常处理代码中lock和unlock QMutex很容易出错,而且很难调试。在这种情况下,可以使用QMutexLocker替代。

QMutex

预期:两个线程使用一把锁,操作一个数据,数据会被两个线程依次打印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;  // 多个线程使用一把锁
    static int num;       // 多个线程访问一个数据
};
#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;
}

运行结果:

QMutexLocker

预期:两个线程使用一把锁,操作一个数据,数据会被两个线程依次打印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:创建的时候加锁,当QMutexLocker局部销毁的时候解锁
        {
            QMutexLocker lock(&this->mutex);
            qDebug() << "Current Thread: " << this
                      << ", Value: " << this->num++;
        }
        QThread::sleep(1);// 线程睡眠两秒
    }
}

运行结果:

到此这篇关于Qt中互斥锁QMutex和QMutexLocker的使用的文章就介绍到这了,更多相关Qt 互斥锁 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文