LED IV特性曲线测试原理与高精度源表实战指南
2026/10/6 23:35:11
在 Qt 中,线程互斥(Thread Mutual Exclusion)通常通过QMutex类来实现,用于保护共享资源,防止多个线程同时访问导致数据竞争(race condition)。
| 类名 | 作用 |
|---|---|
QMutex | 基本互斥锁 |
QMutexLocker | RAII 风格的自动加锁/解锁工具(推荐使用) |
QReadWriteLock | 读写锁(允许多个读,但写独占) |
QReadLocker/QWriteLocker | 对应读写锁的 RAII 封装 |
#include <QThread> #include <QMutex> #include <QMutexLocker> #include <QList> #include <QDebug> QList<int> sharedList; QMutex mutex; class Worker : public QThread { public: void run() override { for (int i = 0; i < 100; ++i) { // 使用 QMutexLocker 自动管理锁 QMutexLocker locker(&mutex); sharedList.append(i); qDebug() << "Thread" << currentThreadId() << "added" << i; } } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Worker w1, w2; w1.start(); w2.start(); w1.wait(); w2.wait(); qDebug() << "Final list size:" << sharedList.size(); // 应为 200 return 0; }✅ 使用
QMutexLocker可以避免忘记调用unlock(),即使发生异常也能自动释放锁。
QRecursiveMutex(Qt 5.14+)或自己封装。若需线程间通信(如生产者-消费者),可结合QWaitCondition:
QMutex mutex; QWaitCondition bufferNotEmpty; bool dataReady = false; // 生产者 { QMutexLocker locker(&mutex); produceData(); dataReady = true; bufferNotEmpty.wakeAll(); // 唤醒等待的消费者 } // 消费者 { QMutexLocker locker(&mutex); while (!dataReady) { bufferNotEmpty.wait(&mutex); // 自动 unlock,被唤醒后重新 lock } consumeData(); }QMutex保护共享数据。QMutexLocker实现 RAII。QWaitCondition或使用 Qt 的信号槽机制(跨线程自动排队)。在 Qt 中,实现**线程互斥(Thread Mutual Exclusion)**以保护共享资源、避免数据竞争的手段有多种。这些方法既包括 Qt 封装的同步原语,也兼容 C++11 标准库中的工具(因为 Qt 可与标准库共用)。以下是Qt 中常用的线程互斥手段分类和具体方法:
QMutexLocker提供 RAII 自动加锁/解锁。QMutex mutex; { QMutexLocker lock(&mutex); // 临界区 }🔸 Qt 5.14+ 引入
QRecursiveMutex(可重入版本)。
QReadWriteLock rwLock; // 读 { QReadLocker locker(&rwLock); // 安全读取 } // 写 { QWriteLocker locker(&rwLock); // 安全写入 }QSemaphore sem(1); // 相当于二值信号量(互斥) sem.acquire(); // 进入临界区 // ... sem.release(); // 离开⚠️ 不如
QMutex直观,一般不用于简单互斥。
QMutex mutex; QWaitCondition notEmpty; // 消费者 mutex.lock(); while (queue.isEmpty()) notEmpty.wait(&mutex); // 自动 unlock,唤醒后 relock item = queue.dequeue(); mutex.unlock();Qt 支持 C++11 及以上,因此以下标准库工具同样有效:
QMutex类似。#include <mutex> std::mutex mtx; { std::lock_guard<std::mutex> lock(mtx); // 临界区 }QReadWriteLock。// Worker 在子线程 emit signal // Main thread 的 slot 自动排队执行,无需手动加锁 connect(worker, &Worker::resultReady, this, &MainWindow::updateUI, Qt::QueuedConnection);✅ 优势:无锁、安全、符合 Qt 设计哲学。
❌ 局限:仅适用于 QObject 之间的通信,不能保护任意共享数据。
QAtomicInt counter; counter.fetchAndAddRelaxed(1); // 线程安全自增 // 或 C++11 std::atomic<int> count{0}; count++;✅ 适用于计数器、标志位等。
❌ 无法保护复杂数据结构(如 QList、自定义对象)。
| 方法 | 是否直接互斥 | 适用场景 | 推荐度 |
|---|---|---|---|
QMutex + QMutexLocker | ✅ 是 | 通用临界区保护 | ⭐⭐⭐⭐⭐ |
QReadWriteLock | ✅ 是 | 读多写少 | ⭐⭐⭐⭐ |
| 跨线程信号槽(Queued) | ❌ 否(但安全) | QObject 通信、UI 更新 | ⭐⭐⭐⭐ |
QAtomicInteger/std::atomic | ❌ 否(无锁) | 简单变量原子操作 | ⭐⭐⭐ |
std::mutex等标准库 | ✅ 是 | 混合 C++ 项目 | ⭐⭐⭐ |
QSemaphore | ⚠️ 间接 | 资源池控制 | ⭐⭐ |
QWaitCondition | ⚠️ 配合互斥 | 条件等待 | ⭐⭐⭐ |
QMutex+QMutexLocker—— 简单、安全、Qt 风格。QReadWriteLock。