线程的实现方法
- 继承QThread 重写run()方法,调用start()便可以使用
- 继承QRunnable 重写run()方法,需要使用线程池:QThread,调用QThreadPool::start()
- moveToThread 直接将实例对象扔到一个线程中,然后通过信号槽调用响应的槽函数(注意信号槽绑定时的第五个参数)
- QtConcurrent 直接调用方法:QtConcurrent ::run()
线程的同步与异步问题
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
所谓异步,是一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
再控制线程同步的问题,我们需要用到一些锁来对数据进行控制
- QMutex 互斥锁
- QReadWriteLock 读写锁(1:只能允许读/写一种操作执行 2:当只执行读操作时,允许多个线程同时读)
- QSemaphore 信号量 互斥锁是保护一个资源,信号量是保护类资源。主要体现在生产者与消费者的关系上
- QWaitCondition 条件