Qt Gui 第十四章

Posted czwlinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 

 

 

 

 

 

以上是关于Qt Gui 第十四章的主要内容,如果未能解决你的问题,请参考以下文章

第十四章 nginx详解

第十四章:类的带参方法

Python 3标准库 第十四章 应用构建模块

JAVA-初步认识-第十四章-线程间通信-等待唤醒机制-代码优化

C primer plus 读书笔记第十四章

Java(第十四章)