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

  • 相关阅读:
    SNF快速开发平台MVC-名片管理(实际名片样式)
    SNF快速开发平台MVC-表格单元格合并组件
    SNF快速开发平台MVC-单据状态水印
    SNF快速开发平台MVC-瀑布式分页组件
    SNF快速开发平台MVC-高级查询组件
    SNF快速开发平台MVC-自由排序组件
    SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)
    SNF快速开发平台MVC-集成了百度开源项目echars
    SNF开发平台WinForm-平板拍照及扫描二维码功能
    SNF快速开发平台--规则引擎整体介绍及使用说明书
  • 原文地址:https://www.cnblogs.com/keleman/p/mm.html
Copyright © 2011-2022 走看看