Qt中互斥锁QMutex和QMutexLocker的使用
作者:小瑞的学习笔记
本文主要介绍了Qt中互斥锁QMutex和QMutexLocker的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
QMutex和QMutexLocker
类 QMutex 的主要函数有:
- lock (); 加锁,如果该互斥锁被占用,该函数阻塞,直到互斥锁被释放。
- unlock ();
- 解锁bool tryLock (int timeout = 0);
表示尝试去加锁,timeout 为超时时间。如果互斥锁为可用状态,该函数会占用该互斥锁,并返回 true ,否则返回 false 。如果互斥锁被另一个线程占用,该函数会等待 timeout 毫秒直到互斥锁为可用状态。
QMutexLocker 类的主要作用是用来管理 QMutex使用 QMutexLocker 的好处是,可以防止线程死锁。该对象在构造的时候加锁,析构的时候解锁。
使用场景
QMutex目的是保护一次只有一个线程访问一个对象、数据结构或一段代码。QMutex通常在较为简单的代码中使用,如果代码复杂最好使用【QMutexLocker+互斥锁】进行多线程同步,这样可以很容易确保锁定和解锁操作执行一致。
- 在复杂函数和语句或异常处理代码中lock和unlock QMutex很容易出错,而且很难调试。在这种情况下,可以使用QMutexLocker替代。
- QMutexLocker在一个需要锁定QMutex的函数中创建。当创建QMutexLocker时,互斥锁被锁定(后面可以使用unlock()和relock()对互斥锁进行解锁和重新锁定)。如果互斥锁锁定了,互斥对象将在QMutexLocker销毁时被解锁。
- 即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 互斥锁 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!