qt各种锁使用讲解

在Qt中,主要有以下几种锁的类型:

1. QMutex(互斥锁):

是最常见的锁类型,用于实现简单的互斥访问。可以通过lock()和unlock()手动控制锁的加锁和解锁。

QMutexLocker:是一个RAII类,用于简化对QMutex的加锁和解锁过程。在创建QMutexLocker对象时,会自动加锁,离开作用域时会自动解锁,确保资源在合适的时候被解锁,避免忘记解锁或异常导致未解锁的情况。

#include <QCoreApplication>
#include <QMutex>
#include <QMutexLocker>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMutex mutex;
    int count = 0;

    for (int i = 0; i < 1000; ++i) {
        QMutexLocker locker(&mutex);
        ++count;
    }

    qDebug() << "Final count:" << count;

    return a.exec();
}

2. QReadWriteLock(读写锁):

用于实现读写分离的锁机制,允许多个线程同时读取共享资源,但只有一个线程可以进行写入操作。可以通过lockForRead()和lockForWrite()手动控制读取锁和写入锁。

QReadLocker和QWriteLocker:是QReadWriteLock的RAII类,用于简化对QReadWriteLock的加读锁和加写锁过程。在创建QReadLocker或QWriteLocker对象时,会自动加读锁或加写锁,离开作用域时会自动解锁,确保资源在合适的时候被解锁。

QReadLocker会锁定读写锁,允许多个线程同时进行读取操作。在每次迭代结束时,QReadLocker的析构函数会自动解锁读写锁,释放锁定,以便其他线程可以继续访问共享数据。
同样,QWriteLocker也是类似的。在每次写入操作之前,QWriteLocker会锁定读写锁,确保写操作是独占的。在每次写入操作完成后,QWriteLocker的析构函数会自动解锁读写锁,使得其他线程可以读取写入共享数据。

可参考博客:Qt读写锁(QReadWriteLock)的使用、读写锁的验证(含源码+注释)-CSDN博客

#include <QCoreApplication>
#include <QReadWriteLock>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QReadWriteLock rwLock;
    int data = 0;

    // 读取操作
    for (int i = 0; i < 100; ++i) {
        QReadLocker locker(&rwLock);
        qDebug() << "Read data:" << data;
    }

    // 写入操作
    for (int i = 0; i < 10; ++i) {
        QWriteLocker locker(&rwLock);
        data += 10;
        qDebug() << "Write data:" << data;
    }

    return a.exec();
}

3. QSemaphore(信号量):

允许控制对共享资源的并发访问数量。可以通过acquire()和release()手动控制资源的获取和释放。

这个可能用得少。

4. QWaitCondition(条件变量):

用于线程间的等待和唤醒,允许一个线程等待特定条件的发生,并在其他线程满足条件时发出信号。

总体来说,Qt提供了丰富的锁机制来帮助开发者实现线程安全的并发编程。选择合适的锁类型取决于具体的并发场景和资源访问需求。在使用锁时,一定要小心避免死锁和竞态条件等问题,确保线程间安全的共享资源访问。同时,使用RAII类(如QMutexLocker、QReadLocker、QWriteLocker)可以简化锁的管理,减少出错的可能性。

这个还没有用到过,不清楚具体实际用途。

示例参考博客:

详细介绍 QT的 各种锁机制_qt 锁-CSDN博客 重点看这个博客

https://www.cnblogs.com/ybqjymy/p/17996935

相关推荐

  1. qt各种使用讲解

    2024-04-04 21:28:02       35 阅读
  2. QT各种及线程同步应用

    2024-04-04 21:28:02       32 阅读
  3. 通俗讲解分布式:场景和使用方法

    2024-04-04 21:28:02       46 阅读
  4. mysql 各种常见的

    2024-04-04 21:28:02       43 阅读
  5. C#各种知识点

    2024-04-04 21:28:02       24 阅读
  6. MySQL各种索引超详细讲解

    2024-04-04 21:28:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 21:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 21:28:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 21:28:02       82 阅读
  4. Python语言-面向对象

    2024-04-04 21:28:02       91 阅读

热门阅读

  1. this与super

    2024-04-04 21:28:02       31 阅读
  2. 自动驾驶领域中的感知,决策,控制

    2024-04-04 21:28:02       38 阅读
  3. 简单认识 node 包的幽灵依赖

    2024-04-04 21:28:02       36 阅读
  4. LeetCode-75. 颜色分类【数组 双指针 排序】

    2024-04-04 21:28:02       35 阅读
  5. 文心一言 vs gpt-4 全面横向比较

    2024-04-04 21:28:02       38 阅读
  6. 【题单】 往届 CSP/j 题目(洛谷)

    2024-04-04 21:28:02       36 阅读