
1.概要
qt 设置线程锁的方式有多少种,并分别举例
2.内容
在 Qt 中,线程同步和线程锁是非常重要的概念,它们确保多线程程序能够安全地访问共享资源。Qt 提供了多种机制来实现线程锁,以下是几种常见的方式,并附上每种方式的示例:
- 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();
}
};
- 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();
}
};
- 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();
}
};
- 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();
}
};
- 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.关联链接
2721

被折叠的 条评论
为什么被折叠?



