Qt线程同步类

本文介绍了Qt中用于线程同步的多个类,包括QMutex、QMutexLocker、QReadWriteLock、QReadLocker、QWriteLocker、QSemaphore、QSemaphoreReleaser和QWaitCondition。这些类提供了线程锁、读写锁、资源数量限制和条件等待等功能,帮助开发者实现线程间的同步和资源访问控制。QMutex和QMutexLocker用于互斥访问,QReadWriteLock支持多读一写,QSemaphore则实现了计数信号量,QWaitCondition提供了条件变量的同步机制。
摘要由CSDN通过智能技术生成

Qt线程同步类

Qt中常用到多线程,因此处理线程间的关系非常重要,对于Qt中的各种线程同步的方法,我在这里做了一个小结。
Qt为线程同步提供了至少8个类,包括QMutex、QMutexLocker、QReadWriteLock、QReadLocker、QWriteLocker、QSemaphore、QSemaphoreReleaser、QWaitCondition。他们能提供基本的线程锁、便利的线程锁、针对读写的线程锁、针对读写的便利线程锁、基于资源数量的线程同步、基于资源数量的便利线程同步、基于条件的线程同步。功能各有不同,使用时需要首先分清楚自己的线程同步所需要的是什么。其中有些我也没有使用过,这些内容来源是Qt的官方文档。

QMutex

QMutex类提供线程之间的访问序列化。
QMutex的目的是保护对象,数据结构或代码段,以便一次只能有一个线程访问它(这类似于Java synchronized关键字)。通常最好使用带有QMutexLocker的互斥锁,因为这样可以轻松确保一致地执行锁定和解锁。
在线程中调用lock()时,尝试在同一位置调用lock()的其他线程将阻塞,直到获得锁定的线程调用unlock()。 Lock()的非阻塞替代方法是tryLock()。
QMutex经过优化,可以在非竞争情况下快速进行。 如果该互斥锁上没有争用,则非递归QMutex将不会分配内存。 它的构造和销毁几乎没有开销,这意味着将许多互斥体作为其他类的一部分是很好的。

QMutex mutex;
int number = 6;

void method1()
{
    mutex.lock();
    number *= 5;
    number /= 4;
    mutex.unlock();
}

QMutexLocker

QMutexLocker类是一个简便类,可以简化锁定和解锁互斥锁。
在复杂的函数和语句中或在异常处理代码中锁定和解锁QMutex是容易出错且难以调试的。 可以在这种情况下使用QMutexLocker来确保互斥锁的状态始终是明确定义的。
应在需要锁定QMutex的函数中创建QMutexLocker。 创建QMutexLocker时锁定互斥锁。您可以使用unlock()和relock()解锁并重新锁定互斥锁。如果锁定,则在销毁QMutexLocker时将解锁互斥锁。

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

    int retVal = 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值