ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QSemaphore示例

2019-09-20 10:42:23  阅读:190  来源: 互联网

标签:Customer Producer 示例 int item vtr QSemaphore public


QSemaphore

//Producer.h
//Producer\Customer都继承于QThread
class Producer:public QThread {
        Q_OBJECT
public:
    Producer(){}
protected:
    void run()override;
};

class Customer:public QThread {
        Q_OBJECT
public:
    Customer(){}
protected:
    void run()override;
};

//Producer.cpp
//ProducerSe初始为1,为了使生产者线程启动提供条件。
QSemaphore ProducerSe(1);
QSemaphore CustomerSe;

void Producer::run(){
    for(int i = 0; i < 1000; ++i) {
        ProducerSe.acquire();
        int num = QRandomGenerator::global()->bounded(5);
        qDebug()<<"Producer:"<<QThread::currentThreadId()
                  <<",release source count:"<<num<<"|"
                  <<QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
        CustomerSe.release(num);
        QThread::msleep(3000);
    }
}

void Customer::run(){
    for(int i = 0; i < 1000; ++i) {
        CustomerSe.acquire() ;
        qDebug()<<"Customer:"<<(int*)QThread::currentThreadId()<<"|"
        <<QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
        ProducerSe.release();
    }
}
OUT:
Producer: 0x474c ,release source count: 0 | "2019-09-20T10:27:10.463"
Producer: 0x474c ,release source count: 2 | "2019-09-20T10:27:13.463"
Customer: 0x3914 | "2019-09-20T10:27:13.463"
Customer: 0x6acc | "2019-09-20T10:27:13.463"
Producer: 0x474c ,release source count: 1 | "2019-09-20T10:27:16.463"
Customer: 0x6b94 | "2019-09-20T10:27:16.463"
Producer: 0x474c ,release source count: 1 | "2019-09-20T10:27:19.465"
Customer: 0x3914 | "2019-09-20T10:27:19.465"
Producer: 0x474c ,release source count: 3 | "2019-09-20T10:27:22.477"
Customer: 0x6b94 | "2019-09-20T10:27:22.477"
Customer: 0x4c98 | "2019-09-20T10:27:22.477"
Customer: 0x5190 | "2019-09-20T10:27:22.477"
//生产者每次随机释放消费者锁个数,阻塞的的消费者随机启动释放的个数。
    
//main.cpp
int main(int argc,char **argv) {}
	Producer p;
    p.start();

    QVector<Customer*> vtr;
    for(int i = 0; i < 5; ++i){
        Customer *c = new Customer;
        QObject::connect(c,&Customer::finished,
                         c,&Customer::deleteLater);
        vtr.push_back(c);
        c->start();
    }

    p.wait();

    for(auto item : vtr){
        if(item != nullptr){
            item->wait();
        }
    }

    for(auto &item : vtr){
        if(item != nullptr){
            delete item;
            item = nullptr;
        }
    }
	return 0;
}

标签:Customer,Producer,示例,int,item,vtr,QSemaphore,public
来源: https://blog.csdn.net/u012199908/article/details/101052895

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有