码迷,mamicode.com
首页 > 其他好文 > 详细

Qt Gui 第十四章

时间:2020-03-01 20:07:57      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:release   free   wrap   wait   ase   增加   cer   als   rod   

一、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 第十四章

标签:release   free   wrap   wait   ase   增加   cer   als   rod   

原文地址:https://www.cnblogs.com/czwlinux/p/12391435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!