zoukankan      html  css  js  c++  java
  • Qt线程的简单使用(四)——QSemaphore的使用

    参考资料:示例来源    http://www.cnblogs.com/venow/archive/2012/10/15/2724943.html

    Qt 帮助手册 QSemaphore

    QSemaphore提供了一定数量的信号量。

    一个 semaphore信号量是一种泛化的mutex。一个mutex只能被锁住一次,但是semaphore被获取多次。信号量通常被用于保护一定数量的同种资源。

    Semaphore提供两种基本的操作,acquire() and release():

    Acquire(n)尝试去n个资源。如果获取不到足够的资源,这个会一直锁住直到可以获取足够的资源。

    Release(n)释放n个资源。

    除了以上的方法,还有tryAcquire()函数,如果得不到足够的资源会立即返回,available()函数,返回在任意时刻可用的资源数目。

    以下是一个生产者/消费者的例子,可以理解QSemaphore的具体使用

     1 #include <QtCore/QCoreApplication>
     2 #include <QSemaphore>
     3 #include <QThread>
     4 #include <iostream>
     5 #include <QTime>
     6 
     7 const int DataSize = 100;
     8 const int BufferSize = 10;
     9 char buffer[BufferSize];
    10 QSemaphore freeSpace (BufferSize);
    11 QSemaphore usedSpace(0);
    12 //1.BufferSize = 1 ,DataSize = 100,生产一个,消费一个。
    13 //2.BufferSize = 100,DataSize = 100;先是大量生产。
    14 
    15 
    16 
    17 //生产者
    18 class Producer:public QThread
    19 {
    20 protected:
    21     void run()
    22     {
    23         qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    24         qsrand(NULL);
    25         for (int i = 0;i < DataSize;++i)
    26         {
    27             freeSpace.acquire();
    28             std::cerr<<"P";
    29             usedSpace.release();
    30         }
    31     }
    32 };
    33 //消费者
    34 class Consumer:public QThread
    35 {
    36 protected:
    37     void run()
    38     {
    39         for (int i = 0;i < DataSize;++i)
    40         {
    41             usedSpace.acquire();
    42             std::cerr<<"C";
    43             freeSpace.release();
    44         }
    45     }
    46 };
    47 
    48 int main(int argc, char *argv[])
    49 {
    50     QCoreApplication a(argc, argv);
    51 
    52     Producer producer;
    53     Consumer consumer;
    54     producer.start();
    55     consumer.start();
    56     producer.wait();
    57 
    58     consumer.wait();
    59 
    60     return a.exec();
    61 }
    宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。
  • 相关阅读:
    在SpringBoot中使用JWT
    异常解决:non-compatible bean definition of same name and class【com.xxx.xxx.XXX】
    mysql 字段名和关键字冲突
    约束(主键、非空、唯一性、外键、检查约束)
    唯一索引与非唯一索引区别(UNIQUE INDEX, NON-UNIQUE INDEX)
    数据库设计mysql字段不默认为NULL原因搜集
    mysql索引总结----mysql 索引类型以及创建
    互联网数据库架构设计思路
    干货满满!10分钟看懂Docker和K8S
    PowerDesigner 使用教程(很具体,很实用)
  • 原文地址:https://www.cnblogs.com/vegetable/p/6684246.html
Copyright © 2011-2022 走看看