博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QWaitConditioin的思考1
阅读量:5341 次
发布时间:2019-06-15

本文共 1453 字,大约阅读时间需要 4 分钟。

16:50:392017-03-31

本文章为原创,如若引用请指明出处,否则追责。

以 生产、消费者的例子说明

#include <QtCore/QCoreApplication>

#include <QWaitCondition>
#include <QThread>
#include <QMutex>
#include <iostream>

const int DataSize = 100;

const int BufferSize = 1;
char buffer[BufferSize];

QWaitCondition bufferIsNotFull;

QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace;

 

class Producer : public QThread

{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();//A
            while (usedSpace == BufferSize)
            {
                bufferIsNotFull.wait(&mutex);//B
            }
            std::cerr<<"P";//C
            ++usedSpace;
            bufferIsNotEmpty.wakeAll();
            mutex.unlock();
        }
    }//…G
};

class Consumer : public QThread

{
protected:
    void run()
    {
        for (int i = 0; i < DataSize; ++i)
        {
            mutex.lock();//D
            while (usedSpace == 0)
            {
                bufferIsNotEmpty.wait(&mutex);//E
            }
            std::cerr<<"C";//F
            --usedSpace;
            bufferIsNotFull.wakeAll();
            mutex.unlock();
        }
        std::cerr<<std::endl;
    }//…K
};

int main(int argc, char *argv[])

{
   Producer producer;
   Consumer consumer;
   producer.start();
   consumer.start();
   producer.wait();
   consumer.wait();
return 0;
}

 

根据QWaitCondition::wait(lockedMutex)的说明:Releases the lockedMutex and waits on the wait condition. The lockedMutex must be initially locked by the calling thread.

在调用wait之前应将lockedMutex锁住 见上面代码的BA处,以及E、D处的调用关系。

之所以先执行Releases the lockedMutex 是因为,调用wait(lockedMutex)后程序直接跳转到G(执行完B)或K处(执行完D),而不再执行C、F处的代码,所以要release the lockedmutex

否则不能保证mutex的lock、unlock的成对执行。

转载于:https://www.cnblogs.com/keleman/p/mm.html

你可能感兴趣的文章
Android 软键盘的显示和隐藏,这样操作就对了
查看>>
【DP+拓扑】关键子工程
查看>>
Jenkins创建job时Check-out Strategy各个选项详细说明(含图)
查看>>
js android页面被挂起问题解决
查看>>
1-4-13:分段函数
查看>>
DAL 层引用 System.Net.Http ,引发的一阵心慌
查看>>
写在最前面的话
查看>>
C语言计算字符串子串出现的次数
查看>>
Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
ios录音Demo
查看>>
2019年第十届蓝桥杯省赛总结(JavaA组)
查看>>
hibernate 第四天 重点查询的方式
查看>>
关于Layer弹出框初探
查看>>
Asp.Net MVC 获取当前 Controller Action Area
查看>>
团队现场编程实战(抽奖系统)
查看>>
Spring Security笔记:使用数据库进行用户认证(form login using database) - 菩提树下的杨过 - 博客园...
查看>>
php扩展redis链接失败,返回false
查看>>
【GOF23设计模式】--单例模式
查看>>
OpenStack Q版本新功能以及各核心组件功能对比
查看>>
MySQL 基础语法结构
查看>>