首页 > 其他分享 >Qt多线程之QMutex

Qt多线程之QMutex

时间:2023-04-18 14:55:45浏览次数:31  
标签:include Qt lock unlock num QMutex mutex 多线程

QMutex

同一个QMutex lock() 时,其他的 lock() 操作要等待 locked 的地方 unlock() (可以保证顺序执行)

测试代码:

#include <iostream>
#include <QThread>
#include <QMutex>
using namespace std;

class myThread1 : public QThread {
public:
    myThread1(int &num, QMutex& mutex) : _num(num), _mutex(mutex) {}
    ~myThread1() {}

    void run() {
        _mutex.lock();
        cout << "ThreadId: " << QThread::currentThread() << endl;
         cout << "thread1 num before: " << _num << endl;
         _num *= 5;
         cout << "thread1 num: " << _num << endl;
         _num /= 4;
        cout << "thread1 num: " << _num << endl;
        _mutex.unlock();
    }

private:
    int     &_num;
    QMutex  &_mutex;
};

class myThread2 : public QThread {
public:
     myThread2(int &num, QMutex& mutex) : _num(num), _mutex(mutex) {}
    ~myThread2() {}

    void run() {
        _mutex.lock();
        cout << "ThreadId: " << QThread::currentThread() << endl;
        cout << "thread2 num before: " << _num << endl;
        _num *= 3;
        cout << "thread2 num: " << _num << endl;
        _num /= 2;
        cout << "thread2 num: " << _num << endl;
        _mutex.unlock();
    }

private:
    int     &_num;
    QMutex  &_mutex;
};

int main()
{
    int num = 6;
    QMutex mutex1;
    QMutex mutex2;
    myThread1 t1(num, mutex1);
    myThread2 t2(num, mutex2);
    t1.start();
    t2.start();

    t1.wait();
    t2.wait();
    cout << "num: " << num << endl;
}

多运行几次,可以发现,输出的结果不相同。

原来的理解:QMutex 可以保护 lock() 和 unlock() 之间的变量(例子中为 _num),在执行到unlock() 之前,别的线程都不可以修改_num 的值。这种理解是错的

 QMutex 能限制的从来都只有自身,如果一个QMutex 对象已经进行的 lock() 操作,但是没有 unlock(), 其它地方的 lock() 操作都会阻塞等待,直到 unlock() 执行。QMutex 就是通过这种方式保证同时只有一个线程在操作共有变量的。

 上面的例子中传了两个不同的 QMutex 进去,所有并没有起到锁的作用,各自还是可以访问

标签:include,Qt,lock,unlock,num,QMutex,mutex,多线程
From: https://www.cnblogs.com/AngleLin/p/17329509.html

相关文章

  • Qt之渐变填充
    Qt现在支持3种类型的渐变填充:(1).线性渐变:在开始点和结束点之间插入颜色(2).辐射渐变:在焦点和环绕它的圆环间插入颜色(3).锥形渐变:在圆心周围插入颜色这三种渐变分别由QGradient的3个子类来表示,QLinearGradient表示线性渐变,QRadialGradient表示辐射渐变,QConicalGradient表示......
  • Ubuntu Server QT开发
    平台:Ubuntu18.04server.文件:qt-everywhere-src-5.12.12.tar.xz1.安装环境1.1通用环境$sudoaptinstallbuild-essentialvimbcflexbisongawklibncurses5-devtexinfocurlwgetunzippython1.2专用环境$sudoaptinstalllibx11-devlibxext-devlibxtst-de......
  • 使用Task的一些知识优化了一下同事的多线程协作取消的一串代码
    最近在看一个同事的代码,代码的本意是在main方法中开启10个线程,用这10个线程来处理一批业务逻辑,在某一时刻当你命令console退出的时候,这个时候不是立即让console退出,而是需要等待10个线程把检测状态之后的业务逻辑执行完之后再退出,这样做是有道理的,如果强......
  • 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
    前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。一:异步1.到底解放了谁?<1>从基础的同步说起要说解放了谁,一定得有几......
  • pyqt5-QFileDialog
    1、介绍这是pyqt的文件选择窗口。2、使用(1)单一文件选择getOpenFileName(parent:QWidget=None,caption:str='',directory:str='',filter:str='',initialFilter:str='',options:Union[QFileDialog.Options,QFileDialog.Option]=......
  • pyqt5-QInputDialog
    1、介绍这是pyqt的对话框输入组件。2、使用getText弹出对话框,让用户输入单行文本getMultiLineText弹出对话框,让用户输入多行文本getInt弹出对话框,让用户输入整数getItem弹出对话框,让用户选择选项fromPySide2.QtWidgetsimportQInputDialog,QLineEdit​#返回值分......
  • iTOP4412开发板Qt程序打包和部署
    因为我们要把写好的程序发给用户来用,写好的源码也不方便给别人看,所以要把程序进行打包部署。步骤一:点击左下角的电脑图标将Debug模式切换到Release模式。release模式:发布版本,不对源代码进行调试,基本没有调试信息。debug模式:调试版本,有很多调试信息。步骤二:找到release模式......
  • 多线程
    本文按照Unix环境高级编程总结而成:线程概念典型的进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情。有了多个线程以后,就可以把进程设计成在某一时刻能够做多件事情,每个线程各自处理独立的任务。这种设计的好处有:通过为每种事件类型分配单独的处理线程,可以......
  • QT MVC开发模式
    一、简单介绍今天我来记录一下在Qt中使用MVC模式进行开发的过程。MVC(Model-View-Controller)是一种常见的软件架构模式,用于将应用程序的逻辑和用户界面分离开来。在Qt中,使用MVC模式可以大大提高应用程序的可维护性和可扩展性。通过将应用程序的逻辑和用户界面分离开来,可以更轻松地......
  • Qt音视频开发38-ffmpeg视频暂停录制的设计
    一、前言基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件必须是能够正常播放的连续......