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