QT多线程(0x03)-信号量

3,890次阅读
没有评论

共计 1147 个字符,预计需要花费 3 分钟才能阅读完成。

之前写过Linux下多线程的文章,其实本质上都差不多,理论都是一样的。。。。。甲壳虫又来了

QT多线程(0x03)-信号量

 


最经典的就是生产者和消费者的问题了,最笨的解决方案就是生产者把所有的空间都填满了东西,然后消费者再去消费,这样的话效率不高,为了追求高效率需要做到生产与消费同时,这样需要控制好访问同一片内存区域。

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

 

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2016-05-14发表,共计1147字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码