【Qtマルチスレッドの信号量】Qsemaphore

4115 ワード

しんごうりょう


どのように簡単に自分にこのメカニズムを説明しますか?
では、この小さなコードを借りて説明しましょう.
QSemaphore freeBytes(80);
QSemaphore usedBytes(0);

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

freeBytes(80)は、信号量の利用可能なリソースがfreeBytes(80)であることを示す.acquire()は、使用可能なリソース-1を使用可能なリソース=0にするまでブロックします.
一方、usedBytes.release()はリソースを解放し、release()のたびに利用可能なリソースを+1させ、このときまた利用可能なリソースがあり、ブロックされた場所で再び実行が開始されます.

≪インスタンス|Instance|emdw≫


古典的な信号量説明メカニズム:生産者と消費者

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