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

  • 相关阅读:
    Jeecms之查询实现
    JEECMS站群管理系统-- 自定义标签及使用自己创建的表的实现过程
    jeecms 修改后台访问路径
    Jeecms6中后台控制层Action如何将值传入前台视图层模板中的?
    原 JEECMS导入IDEA进行二次开发图文教程
    自己动手编写JEECMS自定义栏目统计标签
    深入浅出 Java Concurrency (8): 加锁的原理 (Lock.lock)
    深入浅出 Java Concurrency (7): 锁机制 part 2 AQS
    深入浅出 Java Concurrency (6): 锁机制 part 1 Lock与ReentrantLock
    深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作
  • 原文地址:https://www.cnblogs.com/keleman/p/mm.html
Copyright © 2011-2022 走看看