研究了几天QThread及其同步机制,终于有点领悟,趁着没忘写个笔记。
QThread类只是一个接口,在其里面声明的函数,只有run()在子线程中运行,其他的都被福线程调用。网上说一个slot函数会存在例外,与直接连接和队列连接有关,但我看那些情况比较复杂,我一时
半会是用不到了,而且如果不要求slot函数一定要在子线程中运行,几乎不用管它,只要不用moveToThread()就不会出错。
子线程与主线程的通信最好使用connect(),否则如若在子线充中使用了锁,主线程会被冻结而无法响应,而信号-槽机制可以使主线程立即执行对应函数。但子线程之间的通信就没这么简单了……
再来说说线程同步
Qt提供了至少4种同步机制,他们有相似之处,但更有区别,各有擅长之处,需灵活使用。
QMutex,互斥锁,保证锁过程中的全局变量不被其他线程访问,其它的线程阻塞等待。QMutexLocker()是其简化版(省得unlock()),他应该是一个局部变量,互斥锁在其生命周期之内有效,一对{}就
决定了他的生命长短。
QReadWriteLocker,读写锁,包括lockForRead和lockForWrite(这好像是pthread体系中没有的)。和QMutex不同的是,它允许多个线程同时读全局变量而不是挨个来,如果既有等着读的,又有等着写
的,写优先,写完才能读。
QSemaphore,信号量,允许线程(们)执行若干次,特别适用于一边生产另一边消耗的情况,因为他是限制使用量的。
QWaitCondition,条件等待,wait的线程会被wakeAll()或wakeOne()唤醒,他可以更精确地控制资源落到哪个线程手里,但他只管运行或等待,不管保护全局变量,所以经常要与QMutex配合使用。
QThread类只是一个接口,在其里面声明的函数,只有run()在子线程中运行,其他的都被福线程调用。网上说一个slot函数会存在例外,与直接连接和队列连接有关,但我看那些情况比较复杂,我一时
半会是用不到了,而且如果不要求slot函数一定要在子线程中运行,几乎不用管它,只要不用moveToThread()就不会出错。
子线程与主线程的通信最好使用connect(),否则如若在子线充中使用了锁,主线程会被冻结而无法响应,而信号-槽机制可以使主线程立即执行对应函数。但子线程之间的通信就没这么简单了……
再来说说线程同步
Qt提供了至少4种同步机制,他们有相似之处,但更有区别,各有擅长之处,需灵活使用。
QMutex,互斥锁,保证锁过程中的全局变量不被其他线程访问,其它的线程阻塞等待。QMutexLocker()是其简化版(省得unlock()),他应该是一个局部变量,互斥锁在其生命周期之内有效,一对{}就
决定了他的生命长短。
QReadWriteLocker,读写锁,包括lockForRead和lockForWrite(这好像是pthread体系中没有的)。和QMutex不同的是,它允许多个线程同时读全局变量而不是挨个来,如果既有等着读的,又有等着写
的,写优先,写完才能读。
QSemaphore,信号量,允许线程(们)执行若干次,特别适用于一边生产另一边消耗的情况,因为他是限制使用量的。
QWaitCondition,条件等待,wait的线程会被wakeAll()或wakeOne()唤醒,他可以更精确地控制资源落到哪个线程手里,但他只管运行或等待,不管保护全局变量,所以经常要与QMutex配合使用。