
Qt 锁机制详解一、锁类型对比锁类型特点适用场景QMutex互斥锁同一时刻只有一个线程持有保护共享数据QRecursiveMutex递归锁同一线程可重复加锁嵌套调用场景QReadWriteLock读写锁多读单写读多写少场景QSemaphore信号量管理多个许可资源池控制QWaitCondition条件变量等待特定条件线程间同步二、各锁详细说明1. QMutex互斥锁CQMutex mutex;mutex.lock(); // 阻塞获取锁// 临界区代码mutex.unlock(); // 释放锁// 非阻塞方式if (mutex.tryLock()) {// 获取成功mutex.unlock();}特点排他性同一时刻只有一个线程持有注意同一线程重复加锁会导致死锁2. QRecursiveMutex递归锁CQRecursiveMutex mutex;mutex.lock(); // 计数1mutex.lock(); // 计数2同一线程可重复加锁// 临界区代码mutex.unlock(); // 计数1mutex.unlock(); // 计数0释放锁特点维护引用计数同一线程可重复加锁适用嵌套函数调用场景3. QReadWriteLock读写锁CQReadWriteLock lock;// 读操作可多个线程同时读QReadLocker readLocker(lock);// 读取共享数据// 写操作排他QWriteLocker writeLocker(lock);// 修改共享数据特点多个读锁可共存但写锁独占适用读多写少的场景4. QSemaphore信号量CQSemaphore sem(3); // 初始3个许可sem.acquire(); // 获取1个许可// 使用资源sem.release(); // 释放1个许可sem.acquire(2); // 获取2个许可sem.release(2); // 释放2个许可特点管理多个资源许可适用限制并发访问数量、资源池管理5. QWaitCondition条件变量CQMutex mutex;QWaitCondition condition;bool ready false;QMutexLocker locker(mutex);while (!ready) {condition.wait(mutex); // 释放锁并等待}// 条件满足继续执行// 其他线程唤醒QMutexLocker locker2(mutex);ready true;condition.wakeOne(); // 唤醒一个等待线程特点允许线程等待特定条件适用生产者-消费者模式、线程间同步三、RAII 封装类封装类对应锁作用QMutexLockerQMutex自动加锁/解锁QReadLockerQReadWriteLock自动获取读锁QWriteLockerQReadWriteLock自动获取写锁使用示例C{QMutexLocker locker(mutex); // 构造时加锁// 临界区代码} // 析构时自动解锁四、锁的选择建议保护共享数据→ QMutex嵌套调用→ QRecursiveMutex读多写少→ QReadWriteLock资源池控制→ QSemaphore条件等待→ QWaitCondition QMutex五、关键注意事项避免死锁确保加锁顺序一致最小化临界区只保护必要的代码异常安全使用RAII封装类