`
qimo601
  • 浏览: 3418477 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt 互斥量 QMutex

    博客分类:
  • Qt
阅读更多

QMutex类提供了一种保护一个变量和一段代码的方法。

mutex.lock() //锁住互斥量(mutex)。如果互斥量是解锁的,那么当前线程就立即占用并锁定它。否则,当前线程就会被阻塞,知道掌握这个互斥量的线程对它解锁为止。

mutex.unlock()//解锁

mutex.tryLock()//尝试解锁,如果该互斥量已经锁住,它就会立即返回

 

 

For example, this complex function locks a QMutex upon entering the function and unlocks the mutex at all the exit points:

 

int complexFunction(int flag)
 {
     mutex.lock();

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         mutex.unlock();
         return moreComplexFunction(flag);
     case 2:
         {
             int status = anotherFunction();
             if (status < 0) {
                 mutex.unlock();
                 return -2;
             }
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10) {
             mutex.unlock();
             return -1;
         }
         break;
     }

     mutex.unlock();
     return retVal;
 }
 

This example function will get more complicated as it is developed, which increases the likelihood that errors will occur.

 

在一些复杂函数或时在抛出C++异常函数中锁定和解锁互定量,非常容易发生错误。Qt提供了方便的QMutexLocker类来简化对互斥量的处理。QMu特训Lock二的构造函数接受QMutex作为参数并且将其锁住。QMutexLock的析构函数则对这个互斥量进行解锁。

Using QMutexLocker greatly simplifies the code, and makes it more readable:

 

int complexFunction(int flag)
 {
     QMutexLocker locker(&mutex);

     int retVal = 0;

     switch (flag) {
     case 0:
     case 1:
         return moreComplexFunction(flag);
     case 2:
         {
             int status = anotherFunction();
             if (status < 0)
                 return -2;
             retVal = status + flag;
         }
         break;
     default:
         if (flag > 10)
             return -1;
         break;
     }

     return retVal;
 }
 

Now, the mutex will always be unlocked when the QMutexLocker object is destroyed (when the function returns since locker is an auto variable).

 

分享到:
评论

相关推荐

    Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现

    Qt两种方法实现多线程的开启,及子线程的安全结束线程,及QMutex加锁,Qt单例化实现

    Qt多线程.zip 有几篇关于QT多线程编程的文章

    Qt对线程提供了支持,基本形式有独立于平台的线程类、线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法。 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的。推荐阅读...

    Qt中使用QQueue模拟消息队列

    使用QQueue, QThread,QMutex,QWaitCondition模拟消息队列的任务处理,实现任务的同步处理

    Qt中使用QSemaphore,单生产者—多消费者模型

    Qt中QSemaphore信号量与QMutexLocker、QMutex的使用,单生产者-多消费者模型;界面可设置消费者线程数量;

    QT QWaitCondition demo

    用QT QWaitCondition是一种办法。要让现场B先启动,等待条件变量满足,执行汇集、数据处理等。如果不让线程B先启动,可能造成遗漏。 另外,本文代码还用到了读写锁,... 而且,本文,代码还示意了互斥QMutex。

    Qt语言从入门到精通

    该视频课程内容涉及QT IDE的使用技巧、标签Label、按钮PushButton、输入输出LineEdit、下拉选择ComboBox、函数Function、槽...互斥锁Qmutex、Qt文件监控QFileSystemWatcher、数据库、网络、文件操作等必不可少的内容...

    精通qt4编程(源代码)

    \10.2 线程互斥与同步 264 \10.2.1 临界区问题 265 \10.2.2 使用QMutex 265 \10.2.3 使用QSemaphore 266 \10.2.4 使用QWaitConditon 269 \10.3 线程的其他问题 271 \10.3.1 优先级问题 271 \10.3.2 死锁及优先级反转...

    qmutex_unix.rar_interface_linux QMutex

    QMutex Private for Linux Interface

    精通Qt4编程(第二版)源代码

    \10.2 线程互斥与同步 264 \10.2.1 临界区问题 265 \10.2.2 使用QMutex 265 \10.2.3 使用QSemaphore 266 \10.2.4 使用QWaitConditon 269 \10.3 线程的其他问题 271 \10.3.1 优先级问题 271 \10.3.2 死锁及...

    QtThread.rar

    QtThread 多线程DEMO程序 ,程序使用了qThread类编程,包括使用 QMutex ,QMutexLocker做线程同步

    操作系统课程设计 模拟页面置换算法的实现 基于Qt

    该系统使用的程序设计语言是C++,采用Qt框架开发,其中算法实现时使用了QList、QMap、QQueue等类,借助于QThread类来实现四个线程的同步,对线程的挂起等操作使用了QMutex、QWaitCondition等类。系统中还涉及对音...

    QT 利用继承Qobject实现多线程

    QT 利用继承Qobject实现多线程 利用moveToThread()函数将所需在新线程中处理的内容转移到开辟的新线程中 此外还利用了&lt;QMutex&gt;对不同线程进行加锁

    sampThreadWait.rar

    QWaitCondition提供了一另外一种改进的线程同步方法,QWaitCondition与QMutex结合,可以使一个线程在满足一定条件时通知其他多个线程,使它及时作出响应, 这样比只是用互斥量效率要高一些

    mySemaphores.rar

    QMutex 互斥锁的应用。 一个简单的应用,互斥锁在多线程方位共享资源非常有用。 该示例是Qt5.14 上编写的。控制台显示,非常简单清楚明了了解释了互斥锁的应用。

    QT_QML_Assignment

    Start_Stop_and_Restart_QMutex_QThread: 该项目由Prajwal G,Harikrishnan B和Ananthu S Ajayan完成。 在这里,我们添加了“重新启动”按钮,还添加了停止后继续计数的功能。 Signal_Slot_and_QINVOKABLE: 我...

    Lock_TryLock.rar

    本示例是基于QT多线程互锁的示例,介绍了QMutex lock,trylock以及QMutexLocker的用法区别。

    QMutexTest-20200725.rar

    功能:线程A中增加we,线程B中增加lcome,打印结果welcome或者lcomewe。 例子代码仅使用QMutex,没有使用QMutexLocker。

    MFC多线程之使用CEvent类进行线程同步

    该资源来自http://blog.csdn.net/arcsinsin/article/details/16832417,使用VS2010开放

    基于C++的沙氏大气激光雷达系统控制软件设计与实现

    沙氏大气激光雷达是近几年快速发展的一种大气环境监测技术。沙氏大气激光雷达 技术以高功率、连续波二极管激光器作光源,...技术执行数据处理,“QFutrue+QMutex”协调线程并发,QT信号槽机制进行多线程间消 息传递,Q

    QWaitConditionTest-20200726.rar

    功能:验证QWaitCondition类中wakeOne与wait函数的用法。 功能:验证QWaitCondition类中wakeOne与wait函数的用法。 功能:验证QWaitCondition类中wakeOne与wait函数的用法。

Global site tag (gtag.js) - Google Analytics