WordPress 3.5火车头发布接口,四川网站建设seo优化,服务商是什么意思,文明网站建设总结//本文详细描述QT 中QThread 信号量 实现生成者和消费者。
//调试通过。
//这个例子演示了怎样使用QSemaphore 信号量来保护对生成者线程和消费者线程共享的环形缓冲
//区的访问。 //生成者向缓冲区中写入数据#xff0c;直到达到缓冲区的终点#xff0c;这时它会从起点重…//本文详细描述QT 中QThread 信号量 实现生成者和消费者。
//调试通过。
//这个例子演示了怎样使用QSemaphore 信号量来保护对生成者线程和消费者线程共享的环形缓冲
//区的访问。 //生成者向缓冲区中写入数据直到达到缓冲区的终点这时它会从起点重新开始覆盖已经存在
//的数据 //消费者线程读取它产生的数据并将其输出。 //这个例子中包含Producer和Consumer类它们都继承自QTherad //环形缓冲区用来在这两个缓冲区通讯保护缓冲区的信号量被设置为全局变量
//---------------------------------------------------------------------
//1.main 文件
#include QCoreApplication#include QSemaphore #include producer.h #include consumer.h #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug()start; Producer producer; Consumer consumer; /* 启动生产者和消费者线程 */ producer.start(); consumer.start(); /* 等待生产者和消费者各自执行完毕后自动退出 */ producer.wait(); consumer.wait(); qDebug()end; return a.exec(); }
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//2.全局变量
//2.1全局变量头文件
#include QSemaphore #ifndef GLOBAL_DEF_H #define GLOBAL_DEF_H extern const int DataSize;//生产者将要产生数据的数量 extern const int BufferSize;//环形缓冲区的大小 extern char buffer [];//缓冲区 extern QSemaphore freeBytes;//控制缓冲区的空闲区域生成者还没添加数据或者消费者已经进
//行读取的区域 extern QSemaphore usedBytes;//控制已经使用了的缓冲区区域生成者已经添加数据但是消费
//者还没有读取的区域 #endif // GLOBAL_DEF_H
//---------------------------------------------------------------------
//2.2 全局变量cpp文件
#include global_def.h const int DataSize10;//生产者将要产生数据的数量 const int BufferSize5;//环形缓冲区的大小 char buffer [BufferSize];//缓冲区QSemaphore freeBytes(BufferSize);//控制缓冲区的空闲区域生成者还没添加数据或者消费者已经进行读取的区域 QSemaphore usedBytes(0);//控制已经使用了的缓冲区区域生成者已经添加数据但是消费者还没有读取的区域 //这两个信号保证了生成者永远不会在消费者前多于BufferSize个字节而消费者永远也不会读取生成者还没生成的数据
//---------------------------------------------------------------------
//---------------------------------------------------------------------//3.生成者类
//3.1 生成者类头文件
#ifndef PRODUCER_H #define PRODUCER_H#include QThread #include global_def.h#include QRandomGenerator #include QDebug class Producer : public QThread { public: Producer(); void run() ;//注意大小写不是Run()函数 }; #endif // PRODUCER_H
//--------------------------------------------------------------------- //3.2 生成者类cpp文件
#include producer.h Producer::Producer() {} void Producer::run() { for(int i0;iDataSize;i) { freeBytes.acquire(); int randomInt QRandomGenerator::global()-bounded(100); buffer[i % BufferSize] ACGT[(int) randomInt % 4 ]; qDebug()QString(producer:%1).arg(buffer[i % BufferSize]); usedBytes.release(); } }
//---------------------------------------------------------------------
//---------------------------------------------------------------------//4. 消费者类
//4.1 消费者类 头文件
#ifndef CONSUMER_H #define CONSUMER_H
#include QThread #include QDebug #include global_def.h class Consumer : public QThread { public: Consumer(); void run() ;//注意大小写不是Run()函数 }; #endif // CONSUMER_H
//--------------------------------------------------------------------- //4.2 消费者类 cpp文件
#include consumer.h
Consumer::Consumer()
{} void Consumer::run() { for(int i0;iDataSize;i) { usedBytes.acquire() qDebug()QString(consumer:%1).arg(buffer[i % BufferSize]); freeBytes.release(); } }
//---------------------------------------------------------------------