持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
前言:
Qt中的QThread类用来进行多任务的处理。线程可以做到单个进程做不到的事情。例如,网络应用程序中,可以使用线程处理多种连接器。
QThread继承自QObject,并且提供QMutex来实现同步。线程和进程共享全局变量,可以使用互斥体对改变后的全局变量值实现同步。例如,聊天程序中出现新的连接器或关闭连接时,如果改变连接的用户挂载值的同时浏览了其他进程的挂载值,可能会在访问网络的用户间传递错误数据。因此,必须编辑全局数据时,使用互斥体实现同步,其他进程则不能改变或浏览全局变量值。
QThread类继承自QObject类。因此,线程开始或结束的时候,QThread类发生发送信号事件。信号与槽功能是QThread类从QObject类继承的,可以通过信号与槽处理开始或结束等操作,所以可以实现多线程。
如何创建和启动QThread:
如果要创建线程,就必须继承QThread类。MyTread使用成员函数run()来实现线程启动。
class MyThread:public QThread
{
Q_OBJECT
protected:
void run();
}
void MyThread::run()
{
//具体实现
}
QMutex:
QMutex提供了类似锁定的功能。互斥体激活状态下,线程不能同时访问共享变量,必须在先访问的线程访问完成后,其他线程才可以继续访问,否则会造成程序的崩溃。
一个线程访问互斥体锁定的共享变量期间,如果其他线程也访问此共享变量,那么该线程将会一直处于休眠状态,直到正在访问的线程结束访问。这成为线程安全。
使用QMutex保证线程安全:
class Counter
{
public:
Counter(){n=0;}
void increment(){QMutexLocker locker(&mutex); ++n}
void decrement(){QMutexLocker locker(&mutex); --n}
int value() const{QMutextLocker locker(&mutex); retuen n;}
private:
mutable QMutex mutex;
int n;
}
QMutexLock类在构造函数中自动设置互斥体锁,调用最后一个析构函数则自动解锁。