Qt中生产者消费者模型的两种常用框架

转载: https://blog.csdn.net/xiaoyink/article/details/99710637

 

一、信号量

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

posted @ 2020-12-24 10:20  dsg000  阅读(740)  评论(0)    收藏  举报