Qt线程 互斥量 读写锁 条件等待 信号量

Qt线程

1、Qt线程介绍

Qt程序默认只有一个线程,而该线程要时刻响应界面,所以Qt中设计了信号和槽机制,当执行一个操作时,界面会发出信号,然后槽函数响应并执行,然后再返回界面,当执行一个耗时较长的操作时,界面会卡住。

所有当需要执行耗时较操作时,更适合让新的线程去完成。

2、QThread类

Qt中提供了一个线程类,所以在Qt中使用线程非常方便。

该类无法指定入口函数,需要继承该类,然后覆盖run函数,作为线程的入口函数。

start函数负责启动线程,当它调用后,run函数就开始执行。

注意:一旦从run函数返回,线程就结束了,重新调用start可以让它重新执行。

3、终止线程

调用terminate成员函数可以让线程终止,但是否立即终止由线程高度策略决定。

setTerminationEnabled

可以设置线程是否允许外部终止,该函数只能由线程自己调用才有效。

4、获取线程ID

currentThreadId成员函数用于获取当前线程的线程ID。

5、等待线程结束

wait该函数用于等待线程结束,线程自己不能调用该函数,只能由外部调用,可以设置等待时,默认参数是无符号long类型的最大值。

线程同步

一、互斥量

​ Qt中的互斥量被封装成了QMutex类,成员函数有:
​ 构造函数 相当于 pthread_mutex_init
​ lock 相当于 pthread_mutex_lock
​ trylock 相当于 pthread_mutex_trylock
​ unlock 相当于 pthread_mutex_unlock
​ 析构函数 相当于 pthread_mutex_destroy

​ 练习:使用 pthread_muext_t 封装一个QMutex类。

二、读写锁

​ A读 B读 OK
​ A写 B读 NO
​ A读 B写 NO
​ A写 B写 NO
​ Qt中封装了QReadWriteLock类,实现了读写锁的功能,可以让多个线程同时读写共享数据,但是只有有一个线程对其修改,它与QMutex类的功能类似,不过是对读写功能区别对待,这样可以让多线程具有更多的并发性。

void lockForRead(); // 加读锁
bool tryLockForRead(); // 加测试读锁
bool tryLockForRead(int timeout); // 加测试读锁,带倒计时

void lockForWrite(); // 加写锁
bool tryLockForWrite(); // 加测试写锁
bool tryLockForWrite(int timeout); // 加测试写锁,带倒计时

void unlock(); // 解锁

三、条件等待

​ Qt中的条件变量被封装为QWaitCondition,可以让线程睡入该类。
​ 有四个成员函数:

bool wait(QMutex * mutex, unsigned long time=ULONG_MAX )
功能:互斥锁和线程睡入条件变量
bool wait(QReadWriteLock * readWriteLock, unsigned long time= ULONG_MAX)
功能:读写锁和线程睡入条件变量
void wakeAll ()
功能:从当前条件变量中叫醒所有线程
void wakeOne ()
功能:从当前条件变量中叫醒一个线程    

练习2、参考QThread封装一个线程类,配合pthread_mutext_t、pthread_cond_t实现生产者与消费者模型。

练习3、使用QThread、QMutex、QWaitCondition实现一个生产者与消费者模型,参考Linux系统版的。

四、信号量

​ Qt中的信号量被封装为QSemaphore类,用于保护一定数量的资源。
​ 主要操作:
​ QSemaphore sem(10); 初始化信号量
​ sem.release(1); 信号量加
​ sem.acquire(1); 信号量减
​ sem.available(); 获取信号量的值

你可能感兴趣的:(Qt界面编程学习笔记)