当前位置: 代码迷 >> 综合 >> Qt学习(二)——多线程控制
  详细解决方案

Qt学习(二)——多线程控制

热度:39   发布时间:2023-09-24 05:08:43.0

线程之间存在着相互制约的关系,具体可分为互斥和同步这两种关系。

在程序中,通常都会用到叫做”临界资源“的东西,可能是一块内存,一个数据结构,一个文件等具有排他性使用的东西。这些东西,在多线程环境下,必须进行互斥处理,才能安全地使用临界资源。所以,对临界资源执行互斥操作的代码片段,叫做临界区。

互斥量

通常使用QMutex,QMutexLocker这两个类进行互斥操作。举一个简单的例子:

int createKey(){mutex.lock();++key;return key;mutex.unlock();}
int createKey(){QMutexLocker locker(&mutex);++key;return key;}
第一个代码片段,虽然使用了lock()操作,但unlock()操作在return之后,从而导致unlock()操作永远无法进行。

第二个代码片段locker()函数作为局部变量会在函数退出时结束其作用域,从而自动对互斥量mutex解锁。

信号量

信号量可以理解为对互斥功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。信号亮的典型用例是控制生产者/消费者之间共享的环形缓冲区。

嗯生产者消费者问题,操作系统也讲过啊。

#include <QtCore/QCoreApplication>
#include <qthread.h>
#include <qsemaphore.h>
#include <stdio.h>const int DataSize = 1000;
const int BufferSize = 80;
int buffer[BufferSize];
QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes(0);class Producer :public QThread
{
public:Producer();void run();
};
Producer::Producer()
{}
void Producer::run()
{for (int i = 0; i < DataSize; i++){freeBytes.acquire();//获取一个空闲单元buffer[i%BufferSize] = (i%BufferSize);usedBytes.release();}
}
class Consumer :public QThread
{
public:Consumer();void run();
};
Consumer::Consumer()
{}
void Consumer::run()
{for (int i = 0; i < DataSize; i++){usedBytes.acquire();fprintf(stderr, "%d", buffer[i%BufferSize]);if (i % 16 == 0 && i != 0){fprintf(stderr, "\n");}freeBytes.release();}fprintf(stderr, "\n");
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Producer producer;Consumer consumer;producer.start();consumer.start();producer.wait();consumer.wait();return a.exec();
}


  相关解决方案