一、信号量
const int BufferSize = 4096;
char buffer[BufferSize];
QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);
void Producer::run(){
int i = 0;
while(1){
freeSpace.acquire();
buffer[i++ % BufferSize] = "ACGT"[uint(std::rand()) % 4];
usedSpace.release();
}
}
void Consumer::run(){
int i = 0;
while(1){
usedSpace.acquire();
std::cerr << buffer[i++ % BufferSize];
freeSpace.release();
}
}
二、QWaitCondition和QMutex
const int BufferSize = 4096;
char buffer[BufferSize];
QWaitCondition bufferIsNotFull;
QWaitCondition bufferIsNotEmpty;
QMutex mutex;
int usedSpace = 0;
void Producer::run(){
int i = 0;
while(1){
mutex.lock();
while(usedSpace == BufferSize)
bufferIsNotFull.wait(&mutex);
buffer[i++ % BufferSize] = "ACGT"[uint(std::rand()) % 4];
++usedSpace;
bufferIsNotEmpty.wakeAll();
mutex.unlock();
}
}
void Consumer::run(){
int i = 0;
while(1){
mutex.lock();
while(usedSpace == 0)
bufferIsNotEmpty.wait(&mutex);
std::cerr << buffer[i++ % BufferSize];
--usedSpace;
bufferIsNotFull.wakeAll();
mutex.unlock();
}
}
摘抄自《C++ GUI Qt 4 编程(第二版)》