共计 1147 个字符,预计需要花费 3 分钟才能阅读完成。
之前写过Linux下多线程的文章,其实本质上都差不多,理论都是一样的。。。。。甲壳虫又来了
最经典的就是生产者和消费者的问题了,最笨的解决方案就是生产者把所有的空间都填满了东西,然后消费者再去消费,这样的话效率不高,为了追求高效率需要做到生产与消费同时,这样需要控制好访问同一片内存区域。
#include <QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <stdio.h>
const int DataSize=1000;
const int BufferSize=80;
int buffer[BufferSize];
QSemaphore freeBytes(BufferSize);
QSemaphore usedBytes(0);
class Producer : public QThread
{
public:
Producer();
void run();
};
Producer::Producer()
{
}
void Producer::run()
{
for(int i=0;i<DataSize;i++)
{
freeBytes.acquire();//信号量获取空闲单元,对于填充当前int类型数组而言就是一个int空间,freeBytes数值减一,因为你已经申请到一个啦,当然要减少了
buffer[i%BufferSize]=(i%BufferSize);
usedBytes.release();//usedBytes+1,可以用来读取的数据多了一个了
}
}
class Consumer : public QThread
{
public:
Consumer();
void run();
};
Consumer::Consumer()
{
}
void Consumer::run()
{
for(int i=0;i<DataSize;i++)
{
usedBytes.acquire();//可以用来读取的数据少了一个,好心酸,usedBytes减一个吧
fprintf(stderr,"%d",buffer[i%BufferSize]);
if(i%16==0&&i!=0)
fprintf(stderr,"\n");
freeBytes.release();//哇,我又可以多一个空间来写数据了,好开森
}
fprintf(stderr,"\n");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return a.exec();
}
正文完
请博主喝杯咖啡吧!