• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

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

multi-thread admin 4年前 (2016-05-14) 1746次浏览 0个评论 扫描二维码

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

55ed2f0c0001e90704000222

 


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

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

 


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明QT 多线程(0x03)-信号量
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!