标签: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
标签:release free wrap wait ase 增加 cer als rod
原文地址:https://www.cnblogs.com/czwlinux/p/12391435.html