Qt Gui 第十四章

一、QThread

当要运行多线程,则需要继承该类,并重写对应的run()函数;当启动线程执行run函数的时候,则需要调用start函数;等待run函数执行完毕则是wait函数;

当在run函数中,用一个变量来标记是否一直循环执行的时候;最好该标记使用volatile 该关键字,例如:volatile bool stopped;

该关键字可以使得stopped变量当数据改变的时候不会放进缓存里面,而是直接写入更改该变量;从而不会产生一些不可遇见的错误。

二、互斥锁

 
 当要对某变量进行读取或者写入,处于线程安全的考虑时候可以使用互斥锁: QMutex;例如:
{
    mutex.lock();
    stopped = false;
    mutex.unlock();
}

这样有一个缺点是,当对stopped进行操作的时候发生了异常;则mutex一直处于锁定的状态;

{
    QMutexLocker locker(&mutex);
    stopped = false;
}

则不论stopped是否发生异常,mutex都不会出现死锁的现象。

三、信号锁和读写锁

const int DataSize = 100000;
const int BufferSize = 4096;
char buffer[BufferSize];

QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);

Productor:
        for (int i = 0; i < DataSize; ++i) {
            freeSpace.acquire();
            buffer[i % BufferSize] = "ACGT"[uint(std::rand()) % 4];
            usedSpace.release();
        }

Consumer:
        for (int i = 0; i < DataSize; ++i) {
            usedSpace.acquire();
            std::cerr << buffer[i % BufferSize];
            freeSpace.release();
        }

如上

freeSpace先初始化有BufferSize个信号量

Productor要写入数据的时候,先acquire一个信号量,即freeSpace减掉一个信号量。当写完之后;给usedSpace增加一个信号量:usedSpace.release();

Consumer则相反;

读写锁:即一个数据可以有多个线程同时读,但是只能有一个线程写;

QReadWriteLock lock;

{
QReadLocker locker(&lock);
可以有多个线程同时进这里,执行读操作;
}

{
QWriteLocker wlocker(&locker);
执行写操作
只能有一个线程执行该操作;执行该操作的时候,不能执行读操作;
}

三、QWaitCondition

 
 

猜你喜欢

转载自www.cnblogs.com/czwlinux/p/12391435.html