qt 设置线程锁

1.概要

qt 设置线程锁

2.内容

在 Qt 中,你可以使用 QMutexQReadWriteLock 或 QSemaphore 来实现线程锁。这些类提供了线程同步机制,确保多个线程在访问共享资源时不会发生竞争条件(race conditions)。以下是一些常见用法示例:

使用 QMutex

QMutex 是一个轻量级的互斥锁,用于保护共享资源或代码段,使其在任何时候只能由一个线程访问。

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

QMutex mutex;

class MyThread : public QThread
{
    Q_OBJECT
public:
    void run() override {
        mutex.lock();
        qDebug() << "Thread" << QThread::currentThreadId() << "is running";
        // 访问共享资源的代码
        mutex.unlock();
    }
};

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

    MyThread thread1, thread2;
    thread1.start();
    thread2.start();

    thread1.wait();
    thread2.wait();

    return a.exec();
}

#include "main.moc"

使用 QReadWriteLock

QReadWriteLock 允许多个线程同时读取,但只允许一个线程写入。这对于读多写少的场景特别有用。

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

QReadWriteLock readWriteLock;

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

class WriteThread : public QThread
{
    Q_OBJECT
public:
    void run() override {
        readWriteLock.writeLock();
        qDebug() << "Write Thread" << QThread::currentThreadId() << "is running";
        // 写入共享资源的代码
        readWriteLock.unlock();
    }
};

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

    ReadThread readThread1, readThread2;
    WriteThread writeThread;

    readThread1.start();
    readThread2.start();
    writeThread.start();

    readThread1.wait();
    readThread2.wait();
    writeThread.wait();

    return a.exec();
}

#include "main.moc"

使用 QSemaphore

QSemaphore 是信号量,用于控制对资源的访问,通常用于限制一组资源的并发访问数量。

 

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

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

class MyThread : public QThread
{
    Q_OBJECT
public:
    void run() override {
        semaphore.acquire();
        qDebug() << "Thread" << QThread::currentThreadId() << "is running";
        // 访问共享资源的代码
        semaphore.release();
    }
};

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

    MyThread thread1, thread2, thread3, thread4;
    thread1.start();
    thread2.start();
    thread3.start();
    thread4.start();

    thread1.wait();
    thread2.wait();
    thread3.wait();
    thread4.wait();

    return a.exec();
}

#include "main.moc"

以上是 Qt 中常用的几种线程同步机制的基本用法。根据实际需求选择合适的锁机制,以确保多线程程序的安全性和正确性。

3.关联链接

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

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

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

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

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

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

4.关联知识 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值