• 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 }
    宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流。转载请注明出处。
  • 相关阅读:
    解决:IIS APPPOOLDefaultAppPool 登录失败的问题
    C#操作txt文件并清空添加操作
    linux修改yum本地源的方法
    CentOS防火墙开启、关闭与开放指定端口
    CentOS配置SSH远程连接
    判断js对象是否拥有某一个属性的js代码
    bash脚本输入密码不回显问题的解决方法
    js控制表单操作的常用代码小结
    绝版Node--Sequlize搭建服务(Node全栈之路 二)
    绝版Node--Sequlize搭建服务(Node全栈之路)
  • 原文地址:https://www.cnblogs.com/vegetable/p/6684246.html
Copyright © 2020-2023  润新知