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

  • 相关阅读:
    Qt之界面数据存储与获取(使用setUserData()和userData())
    UML中关联(Association)、聚合(Aggregation)和合成(Composition)之间的区别
    Entity Framework Model First下改变数据库脚本的生成方式
    keepalive学习
    函数、极限、连续
    C#集合基础与运用
    面向查询服务的参数化查询
    WinDbg 命令手册
    知识管理方法论
    项目管理Project
  • 原文地址:https://www.cnblogs.com/keleman/p/mm.html
Copyright © 2011-2022 走看看