qt 设置线程锁的方式有多少种,并分别举例

1.概要

qt 设置线程锁的方式有多少种,并分别举例

2.内容

在 Qt 中,线程同步和线程锁是非常重要的概念,它们确保多线程程序能够安全地访问共享资源。Qt 提供了多种机制来实现线程锁,以下是几种常见的方式,并附上每种方式的示例:

  1. QMutex

QMutex 是 Qt 中最基本的互斥锁。它用于保护共享资源或代码段,以防止多个线程同时访问。

#include <QMutex>
#include <QThread>
#include <QDebug>

QMutex mutex;

class MyThread : public QThread
{
protected:
    void run() override {
        mutex.lock();
        qDebug() << "Thread" << threadId() << "is running";
        // 访问共享资源
        mutex.unlock();
    }
};
  1. QReadWriteLock

QReadWriteLock 提供了更细粒度的锁机制,允许多个读线程同时访问,但写线程具有独占访问权。

#include <QReadWriteLock>
#include <QThread>
#include <QDebug>

QReadWriteLock readWriteLock;

class ReadThread : public QThread
{
protected:
    void run() override {
        readWriteLock.readLock();
        qDebug() << "Read Thread" << threadId() << "is running";
        // 读取共享资源
        readWriteLock.unlock();
    }
};

class WriteThread : public QThread
{
protected:
    void run() override {
        readWriteLock.writeLock();
        qDebug() << "Write Thread" << threadId() << "is running";
        // 写入共享资源
        readWriteLock.unlock();
    }
};
  1. QSemaphore

QSemaphore 是信号量,用于控制对资源的访问线程数。它可以用来保护一定数量的相同资源。

#include <QSemaphore>
#include <QThread>
#include <QDebug>

QSemaphore semaphore(3); // 允许3个线程同时访问资源

class MyThread : public QThread
{
protected:
    void run() override {
        semaphore.acquire();
        qDebug() << "Thread" << threadId() << "has acquired the semaphore";
        // 访问共享资源
        semaphore.release();
    }
};
  1. QWaitCondition

QWaitCondition 用于线程间的等待通知机制。一个或多个线程可以等待某个条件,而另一个线程在条件满足时发出通知。

#include <QWaitCondition>
#include <QMutex>
#include <QThread>
#include <QDebug>

QWaitCondition condition;
QMutex mutex;
bool ready = false;

class WorkerThread : public QThread
{
protected:
    void run() override {
        mutex.lock();
        condition.wait(&mutex);
        qDebug() << "Thread" << threadId() << "is running after being notified";
        // 执行任务
        mutex.unlock();
    }
};

class NotifierThread : public QThread
{
protected:
    void run() override {
        QThread::sleep(2); // 模拟一些工作
        mutex.lock();
        ready = true;
        condition.wakeAll();
        qDebug() << "Notifier Thread" << threadId() << "has notified others";
        mutex.unlock();
    }
};
  1. QFuture 和 QFutureWatcher

虽然 QFuture 和 QFutureWatcher 主要用于管理和监视异步操作的结果,但它们也可以与 QMutex 等锁结合使用,以保护共享资源。

#include <QtConcurrent/QtConcurrent>
#include <QFuture>
#include <QFutureWatcher>
#include <QMutex>
#include <QDebug>

QMutex mutex;

void longRunningTask() {
    mutex.lock();
    qDebug() << "Long running task in thread" << QThread::currentThread();
    // 执行长时间任务
    mutex.unlock();
}

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

    QFuture<void> future = QtConcurrent::run(longRunningTask);
    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher::finished, []() {
        qDebug() << "Task finished";
    });
    watcher.setFuture(future);

    return app.exec();
}

这些是 Qt 中常用的几种线程锁机制。根据具体的应用场景和需求,选择合适的锁机制可以确保多线程程序的安全性和效率。

3.关联链接

qt 添加线程锁-优快云博客

qt 添加线程锁 有多少种方式-优快云博客 

qt 添加线程锁 有多少种方式,并分别举例-优快云博客 

qt 设置线程锁的方式有多少种,并分别举例-优快云博客 

qt 设置线程锁的方式有多少种-优快云博客 

qt 设置线程锁-优快云博客 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值