【Qt多线程之信号量】Qsemaphore

信号量

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

那就借这个小代码解释吧

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 
#include 

class Producer : public QThread
{
public:
    Producer();
    void run();
};

class Consumer : public QThread
{
public:
    Consumer();
    void run();
};

#endif

semaphore.cpp

#include "semaphore.h"
#include 

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 
#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();
}

你可能感兴趣的:(Qt)