【Qt多线程之信号量】Qsemaphore

来源:互联网 发布:淘宝会员卡怎么设置 编辑:程序博客网 时间:2024/04/29 14:05

信号量

怎么简单的给自己解释这个机制呢?

那就借这个小代码解释吧

QSemaphore freeBytes(80);QSemaphore usedBytes(0);freeBytes.acquire();buffer[i%BufferSize] = (i%BufferSize);usedBytes.release();      

freeBytes(80)表示信号量中的可用资源是80,而每次freeBytes.acquire()都会让可用资源-1,直到可用资源=0时,这时候就会引发阻塞;

另一方面可以通过usedBytes.release()来释放资源,每次release()都会让可用资源+1,这时候又有可用资源了,阻塞的地方也就再次开始运行了。

实例

经典的信号量说明机制:生产者和消费者

semaphore.h

#ifndef SEMAPHORE_H#define SEMAPHORE_H#include <QSemaphore>#include <QThread>class Producer : public QThread{public:    Producer();    void run();};class Consumer : public QThread{public:    Consumer();    void run();};#endif

semaphore.cpp

#include "semaphore.h"#include <QtDebug>const int DataSize = 1000;const int BufferSize = 80;int buffer[BufferSize];QSemaphore freeBytes(BufferSize);QSemaphore usedBytes(0);/********消费者**********************************************/Consumer::Consumer(){}void Consumer::run(){    usedBytes.acquire();    for (int i = 0; i < DataSize; i++)    {        usedBytes.acquire();        qDebug() << buffer[i%BufferSize];        if (i % 16 == 0 && i != 0)            qDebug() << "\n";        freeBytes.release();    }}/********生产者**********************************************/Producer::Producer(){}void Producer::run(){    for (int i = 0; i < DataSize; i++)    {        freeBytes.acquire();        buffer[i%BufferSize] = (i%BufferSize);        usedBytes.release();        //每次读入一个数,告知消费者可以读数了    }}

main.cpp

//Application这个类是继承QCoreApplication的,而QCoreApplication有继承//QObject的,而QObject就是QT中最基本的基类,也就是QT的根基了,//.acquire() 每使用一次,引用计数-1//.release() 每使用一次,引用计数+1#include <QCoreApplication>#include "semaphore.h"int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    Producer p;    Consumer c;    p.start();    c.start();    p.wait();    c.wait();    return a.exec();}
0 0