Qt生产者消费者实验(1):信号量

本文介绍了一个基于信号量实现的生产者消费者模型实验,使用C++与Qt线程库进行编码。实验中,生产者线程随机生成数据填充到缓冲区,而消费者线程读取这些数据。通过调整缓冲区大小,可以观察到不同的同步效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/*
生产者和消费者实验使用信号量实现线程的同步
*/
#include <QtCore>
#include <iostream>

const int DataSize = 100;
const int BufferSize = 10;
char buffer[BufferSize];

//定义两个信号量
QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);//刚开始没有生产者写好的数据,所以初始化为0


//生产者
class Producer : public QThread
{
public:
    void run();
};

//start()调用的就是run()函数。他是一个虚函数,默认情况下调用exec()
//从该函数返回表示线程已经结束
//生产者随机生成一个字母填充进缓冲区buffer
void Producer::run()
{
    for (int i = 0; i < DataSize; ++i) {
        freeSpace.acquire();//获取“自由的”字节
        buffer[i % BufferSize] = "ACGT"[uint(rand()) % 4];
        std::cerr << "P";
        usedSpace.release();//转换为“用过的”(填充过的)字节
    }
}


//消费者
class Consumer : public QThread
{
public:
    void run();
};
//将生产者填充进“用过的”字节的字幕读取并输出到控制台
void Consumer::run()
{
    for (int i = 0; i < DataSize; ++i) {
        usedSpace.acquire();//获取“用过的”资源,如果没有则一直阻塞,直到有资源为止
        //std::cerr << buffer[i % BufferSize];
        char Cons = buffer[i % BufferSize];
        std::cerr <<"c";
        freeSpace.release();
    }
    std::cerr << std::endl;
}


//主程序
int main()
{
    Producer producer;
    Consumer consumer;
    producer.start();//通过调用run来执行线程
    consumer.start();
    producer.wait();//wait()和pthread_join()功能类似
    consumer.wait();
    return 0;
}

执行结果:

BufferSize 不同对应的结果也稍有不同

(1)

const int DataSize = 100;
const int BufferSize = 1;

PcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPc

(2)


const int DataSize = 100;
const int BufferSize = 10;

PPPPPPPPPPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcccccccccc

(3)

const int DataSize = 100;
const int BufferSize = 100;

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值