多线程同步
互斥
QMutex mutex
-
mutex.lock( )
-
mutex.unlock( )
-
特点:每次只有一个线程可以访问同一变量
-
缺点:
- 多线程访问时,容易造成性能下降
- 容易发生错误
QMutexLocker locker
- locker(&mutex)
- 优点:不用每次都去人为调用mutex.unlock( )
- 析构函数则对这个互斥量进行解锁
同步
QReadWriteLock rwLock
-
Read
- rwLock.lockForRead( )
- rwLock.unlock( )
-
Write
- rwLock.lockForWrite( )
- rwLock.unlock( )
QReadLocker rwLocker
- rwLocker(&rwLock)
QWriteLocker rwLocker
- rwLocker(&rwLock)
同QMutexLocker对QMutex的作用一样,使用QReadLocker和QWriteLocker对QReadWriteLock进行锁定和解锁
信号量
QSemphore
-
用于保护一定数量的相同资源
-
QSemphore
-
QSempohre semphore( num )
-
semphore.accquire( )
- 获取信号量
- 获取不到则阻塞等待
-
sempohore.release( )
- 释放信号量
-
QWaitCondition
-
结合QMutex, 允许一个线程在满足一定的条件下触发其他多个线程
-
bufferIsNotFull
- bufferIsNotFull.wait(&mutex)
-
bufferIsNotEmpty
- bufferIsNotEmpty.wait(&mutex)
与主线程通信
通过信号和槽,connect的第5个参数同步
在底层,实际是通过置入一个事件来实现这些连接的。
子进程任务(事件)
- 可以完成事件并发送事件给主窗口以报告进度
“类是安全的”
线程安全的
- 当函数可以同时被不同的线程安全地调用
类安全的
- 一个类的所有函数都可以同时被不同的线程调用,并且它们之间互不干涉
- 即使是操作同一对象的时候也不互不妨碍
Qt非图形用户界面类
可重入
- “re-entrant”
可重入对象
- 多线程访问,需要互斥量来保护这个类
- 在没有被全局引用或者被其他共享数据引用的C++类都认为是可冲入的
QObject的重入约束条件
- QObject 的子对象必须在它的父对象线程中创建
- 在删除对应的QThread对象之前,必须删除所有在次线程中创建的QObejct对象。通过在QThread::run( )中的堆栈上创建这些对象即可
- 必须在创建QObject对象的线程中删除它们