• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

QT多线程(0x04)–线程等待与唤醒

Qt admin 4年前 (2016-05-14) 2168次浏览 0个评论 扫描二维码

信号量的方法解决生产与消费者的问题,通过申请读写空间的成功与失败进行相应的线程运行与阻塞达到目的。要是生产者线程结束去唤醒消费者也是一个解决问题的思路,消费者消费之后去唤醒生产者线程,这样就可以解决生产者与消费者的问题。甲壳虫闪亮登场。。。。

55ed2f0c0001e90704000222


 

#include <QThread>
#include <QtDebug>
#include <QMutex>
#include <QWaitCondition>
#include <iostream>
#include <QCoreApplication>
QWaitCondition bufferEmpty;
QWaitCondition bufferFull;
QMutex mutex;
const int DataSize = 1000;
const int BufferSize = 80;
int buffer[BufferSize];

int numUsedBytes = 0;
int rIndex = 0;
class Producer :
 public QThread
{
public:
 Producer();
 ~Producer();

 void run();
};
Producer::Producer()
{

}

Producer::~Producer()
{

}

void Producer::run()
{
 for (int i = 0; i < DataSize; i++)
 {
 mutex.lock();
 if (numUsedBytes == BufferSize)
 bufferEmpty.wait(&mutex); //容量已满,生产者阻塞
 buffer[i%BufferSize] = i%BufferSize;
 numUsedBytes++; //用来记录当前缓冲区是否已满
 bufferFull.wakeAll(); //缓冲区有容量,唤醒消费者
 mutex.unlock();
 }
}

class Comsumer :
 public QThread
{
public:
 Comsumer();
 ~Comsumer();
 void run();
};

Comsumer::Comsumer()
{

}

Comsumer::~Comsumer()
{

}

void Comsumer::run()
{
 forever
 {
 mutex.lock();
 if (numUsedBytes == 0)
 bufferFull.wait(&mutex); //容量为空,阻塞消费者
 qDebug() << currentThreadId() << buffer[rIndex%BufferSize];
 rIndex=(++rIndex)%BufferSize;
 numUsedBytes--;
 bufferEmpty.wakeAll(); //缓冲区未满,唤醒生产者
 mutex.unlock();
 }
 std::cout << std::endl;
}


int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

 Producer producer;
 Comsumer consumerA;
 Comsumer consumerB;

 producer.start();
 consumerA.start();
 consumerB.start();

 producer.wait();
 consumerA.wait();
 consumerB.wait();

 return a.exec();
}
//forever 用法定义,比 c++高端,略叼

#define Q_FOREVER for(;;)
#ifndef QT_NO_KEYWORDS
#  ifndef foreach
#    define foreach Q_FOREACH
#  endif
#  ifndef forever
#    define forever Q_FOREVER
#  endif
#endif

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明QT 多线程(0x04)–线程等待与唤醒
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!