在多个线程访问同一个值时,可能会出现难以预估的结果,为了保证线程操作的原子性,Qt提供了QMutex, QMutexLocker, QReadLocker, QWriteLocker, QReadWriteLocker, QSemaphore等类来进行线程访问控制。
例如卖票程序的设计,要保证票号不重复,每卖一张,票号加一,有多个窗口同时卖,那么此时就得保证票的序号是一直递增,我们设计一个简单的类,如下所示:
class Ticket
{
public:
Ticket() { m_Cnt = 0; };
int keyAdd()
{
m_Cnt++;
return m_Cnt;
}
int getkey()
{
return m_Cnt;
}
private:
int m_Cnt;
};
在多线程下这个类是不安全的,多个线程可能同时修改私有成员m_Cnt,结果是不可预料的。
而且自增操作符“++”不是原子操作,编译后会是3条机器命令:
- 将变量值载入寄存器;
- 将寄存器中的值加一;