`
qimo601
  • 浏览: 3449738 次
  • 性别: 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).

 

分享到:
评论

相关推荐

    多任务编程超入门-(8) 递归互斥量

    在QT库中,`QMutex`类提供了互斥量的功能,其中`QMutex::Recursive`类型就是递归互斥量。下面是一个简单的示例: ```cpp #include &lt;QMutex&gt; #include class Worker : public QObject { Q_OBJECT public: void ...

    qt5多线程,信号量,互斥量,等待条件

    在QT5中,QMutex类实现了互斥量。当一个线程持有了互斥量,其他试图获取该互斥量的线程将被阻塞,直到该线程释放互斥量。这在多线程环境中非常有用,可以确保同一时间只有一个线程能够访问某个资源,防止数据竞争...

    QT6之多线程控制-互斥量和信号量

    在QT6中,我们可以使用`QMutex`类来实现互斥量。例如,在`qmythread.cpp`中,可能有一个`QMutex`成员变量用于保护共享数据。在需要访问这些数据的地方,线程会调用`QMutex::lock()`尝试获取锁,成功后执行代码,完成...

    QT 下 信号量使用

    在QT中,QMutex也可以实现类似的功能,但QSemaphore更灵活,可以用于控制同时访问的线程数量。 **4. 防止死锁** 在使用信号量时,必须注意防止死锁的发生。死锁是指两个或更多线程相互等待对方释放资源,导致所有...

    QT4线程临界区的应用

    QT4提供了丰富的多线程支持,包括线程类(QThread)以及同步机制,如临界区(Critical Section)、互斥量(Mutex)等。下面将详细解释这些概念及其在QT4中的应用。 1. **线程**:在多核或多处理器系统中,线程是程序执行...

    QT的互斥锁源码.zip

    - 除了互斥锁,QT还提供了`QSemaphore`(信号量)、`QWaitCondition`(等待条件)等其他同步原语,它们在特定场景下可能更有优势。 - `QThread`类代表了一个线程实体,可以方便地将工作移到单独的线程。 通过分析...

    qmutex_unix.rar_interface_linux QMutex

    QMutex是Qt库提供的一种互斥锁(Mutex)实现,用于确保对共享资源的独占访问,防止数据竞争问题。本篇将详细探讨"qmutex_unix.rar_interface_linux QMutex"的相关知识点,特别是它在Linux环境下的接口设计。 QMutex...

    qt4 线程同步的小例子

    线程同步在QT4中有多种实现方式,包括信号槽机制、互斥量(`QMutex`)、信号量(`QSemaphore`)、读写锁(`QReadWriteLock`)以及条件变量(`QWaitCondition`)。信号槽是QT特有的事件驱动通信机制,可以用于线程间...

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

    `QMutexLocker`和`QMutex`是Qt提供的互斥锁机制,用于保护共享资源免受并发访问。`QMutex`是互斥锁的基本实现,它确保一次只有一个线程可以持有锁并访问受保护的代码区域。`QMutexLocker`是`QMutex`的便利类,它在...

    Qt多线程编程.pdf

    在Qt中,QMutex类提供了互斥量的功能,可以防止多个线程同时访问共享资源。QMutexLocker类是一个便利类,它在构造函数中自动调用QMutex的lock()方法,在析构函数中自动调用unlock()方法。这样就可以确保在函数执行...

    《Qt4+图形设计与嵌入式开发》pdf版本

    - 线程安全编程和互斥量(QMutex) 9. **第10章 Qt工具使用**: - Qt Designer用于图形化界面设计 - UIC和MOC编译工具的使用 - qmake项目构建系统 - 使用Qt Assistant和Qt Linguist进行文档查看和翻译 10. **...

    Qt多线程编程

    - `bool tryLock()`:尝试锁定互斥量,如果失败则立即返回。 **4. QMutexLocker** - `QMutexLocker`是一个方便的类,用于自动锁定和解锁`QMutex`。它通常与RAII(Resource Acquisition Is Initialization)模式...

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

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

    qt_multiThread.rar_QT 多线程_qt多线程

    - 为了避免竞态条件和数据不一致,Qt提供了多种同步原语,如QMutex(互斥锁)、QSemaphore(信号量)、QWaitCondition(等待条件)等,用于保护共享资源。 5. **线程池**: - 为了更有效地管理和调度线程,QT提供...

    qt c++内存共享

    QMutex是互斥锁,确保任何时候只有一个线程能访问受保护的资源,防止并发冲突。QReadWriteLock则更灵活,允许多个线程同时读取,但只有单个线程写入。在共享内存时,这些同步工具至关重要,它们可以确保数据的完整性...

    linux 下qt实现哲学家问题

    可以使用Qt的互斥锁(QMutex)或者信号量(QSemaphore)来实现。例如,每支筷子是一个资源,哲学家在尝试拿起筷子前需要先获取对应的锁。 4. **条件变量**(QWaitCondition):为了等待某个条件满足,哲学家可能...

    Qt中的多线程(一)

    QMutex用于实现互斥量,确保同一时间只有一个线程可以访问受保护的资源。QMutexLocker是一个便利类,可以自动进行加锁和解锁操作,防止因忘记解锁而导致的问题。 QReadWriteLock则进一步提高了并发性,允许多个线程...

    黄强老师、Qt多线程编程源码.rar

    在多线程环境下,共享数据的访问需要特别小心,可能需要使用互斥量(QMutex)、读写锁(QReadWriteLock)或者信号量(QSemaphore)等同步机制。 4. **异步编程模型**:Qt的异步编程模型是基于事件循环的,线程中的...

    QT.rar_QT 多线程_QT 多线程_QT线程_qt多线程_多线程qt

    4. **线程同步**:为了避免竞态条件和死锁,QT提供了多种同步机制,如QMutex(互斥量)、QSemaphore(信号量)和QWaitCondition(等待条件)等。这些工具可以帮助开发者控制对共享资源的访问。 5. **线程退出**:...

    QT写的服务器(线程)

    4. **并发控制**:在多线程环境中,需要处理并发访问共享资源的问题,QT提供了互斥量(QMutex)、信号量(QSemaphore)和条件变量(QWaitCondition)等同步原语,确保数据的安全访问。 5. **信号和槽**:QT的信号和...

Global site tag (gtag.js) - Google Analytics