zoukankan      html  css  js  c++  java
  • QWaitConditioin的思考1

    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的成对执行。

  • 相关阅读:
    非原创-MongoDB PHP 扩展
    原创-docker命令
    原创-k8s nginx内核参数优化
    原创-阿里云K8S-PVCyaml文件挂载云盘
    原创-k8s反亲和性
    使用Virtualenv隔离Python、Ansible不同发行版
    基于Scrapy分布式爬虫的开发与设计
    CentOS7.3中将Python2.7.5 升级到Python3.5.1
    如何让django的model名和应用名显示为中文
    Django添加ckeditor富文本编辑器
  • 原文地址:https://www.cnblogs.com/keleman/p/mm.html
Copyright © 2011-2022 走看看