qt线程启动后等待返回_QT多线程(0x04)–线程等待与唤醒

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

#include

#include

#include

#include

#include

#include

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值