Qt LockSemaphore

张开发
2026/6/8 7:05:01 15 分钟阅读
Qt LockSemaphore
锁QMutexQMutex 是 Qt 框架提供的互斥锁类用于保护共享资源的访问实现线程间的互斥操作。在多线程环境下通过互斥锁来控制对共享数据的访问确保线程安全。QMutex mutex; mutex.lock(); // 加锁 // ... 共享资源 mutex.unlock(); // 解锁QMutexLockerQMutexLocker 是 QMutex 的辅助类简化对互斥锁的上锁和解锁操作避免忘记解锁导致的死锁等问题。QMutex mutex; { QMutexLocker locker(mutex); // 在作用域内自动上锁出了作用域自动解锁 }QReadWriteLocker、QReadLocker、QWriteLockerQReadWriteLock 读写锁类用于控制读和写的并发访问。QReadLocker 用于读操作上锁允许多个线程同时读取共享资源。QWriteLocker 用于写操作上锁只允许一个线程写入共享资源。多个线程可以同时读取共享数据但只有一个线程能够进行写操作。读写锁提供了更高效的并发访问方式。QReadWriteLock rwLock; // 在读操作中使用读锁 { QReadLocker locker(rwLock); // 在作用域内自动上读锁出了作用域自动解锁 // 读取共享资源 // ... } // 在写操作中使用写锁 { QWriteLocker locker(rwLock); // 在作用域内自动上写锁出了作用域自动解锁 // 修改共享资源 // ... }信号量QSemaphoreQSemaphore 是 Qt 框架提供的计数信号量类用于控制同时访问共享资源的线程数量。QSemaphore semaphore(2); // 同时允许两个线程访问共享资源 // 在需要访问共享资源的线程中 semaphore.acquire(); // 尝试获取信号量若已满则阻塞 // 访问共享资源 // ... semaphore.release(); // 释放信号量 // 在另一个线程中进行类似操作QWaitConditionQWaitCondition是Qt中的一个类用于在多线程编程中实现线程同步。它允许一个线程通知其他线程某个条件已经满足从而协调线程之间的工作。QWaitCondition通常与QMutex一起使用以确保线程安全。在生产者-消费者模型中生产者线程负责生成数据而消费者线程负责处理数据。QWaitCondition可以用来协调生产者和消费者之间的工作确保数据的正确读写。wait用于让线程在条件未满足时阻塞等待直到被其他线程通过wakeOne()或wakeAll()唤醒或者等待超时在使用时必须传入一个上锁的 QMutex 对象wakeAll在满足特定条件时唤醒所有等待线程wakeOne在满足特定条件时随机唤醒一个正在等待的线程onst int data_size 50; const int buf_size 10; char buffer[buf_size]; QWaitCondition buffer_is_not_full; QWaitCondition buffer_is_not_empty; QMutex mutex; int used_space0; class Producer : public QThread { protected: void run() { for (int i 0; i data_size; i) { mutex.lock(); while (used_space buf_size) { // 如果buffer已经满了这时不能再生产了 buffer_is_not_full.wait(mutex); // 等待buffer_is_not_full调用wakeAll/wakeOne否则继续阻塞 // 等待mutex 释放 } std::cerra; used_space; buffer_is_not_empty.wakeAll(); // 唤醒消费线程 mutex.unlock(); } } }; class Consumer : public QThread { protected: void run() { for (int i 0; i data_size; i) { mutex.lock(); while (used_space 0) { // buffer已经空了这时不能再消费类了 buffer_is_not_empty.wait(mutex); // 等待buffer_is_not_empty调用wakeAll/wakeOne否则继续阻塞 } std::cerrb; --used_space; buffer_is_not_full.wakeAll(); // 唤醒生产线程 mutex.unlock(); } std::cerrstd::endl; } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return app.exec(); }

更多文章