永发信息网

求大神加上注释,越详细越好 #include <stdio.h> #include <stdlib

答案:1  悬赏:60  手机版
解决时间 2021-01-25 13:49
求大神加上注释,越详细越好 #include <stdio.h> #include <stdlib
最佳答案
首先这是一个生产者和消费者问题。生产者producer负责产生数据,然后通过put操作将数据放到缓冲区buf中。消费者consumer负责显示数据,通过get操作从缓冲区buf中读取数据。========》先看主函数main(),生产者和消费者分别用两个线程来实现。主函数中的pthread_create()函数就是用来创建这两个线程的。开始定义了两个变量th_a,th_b用来记录这两个线程的线程号。线程的程序体分别是producer,consumer。接下来的pthread_join用来等待两个线程结束。因为如果不等待,main函数的主线程会立即结束,而两个子线程还来不及完全执行。=======》下面来分别看producer,consumer这两个线程。producer循环一百次,每次调用put往buffer中放数据,最后放一个OVER;consumer循环用get从buffer中读到数据并打印,直到读取的数据位OVER数据时结束。=======》我们再分别来看put操作和get操作。由于put和get都要访问buf,buf就是一个临界资源,为了解决这个临界资源,在使用buf之前,要对它加锁。pthread_mutex_lock(b->lock)一个为信号量加锁的函数。每个信号量只能加锁一次(我说的可能不准确),如果执行该函数的时候,参数中的信号量已经被加锁,则该函数阻塞,直到信号量被解锁才继续执行。这样就能保证信号量所保护的临界资源能够被互斥的访问。struct prodcons { int buffer[BUFFER_SIZE]; pthread_mutex_t lock; int readpos, writepos; pthread_cond_t notempty; pthread_cond_t notfull; }; buf是一个循环的缓冲区,我们先来看缓冲区为空和满这两种状态时,读、写标记(readpos,writepos)的位置。缓冲区为空时,readpos 和writepos指在同一位置;换从去为满时,writepos位置的下一个位置就是readpos。 void put(struct prodcons * b, int data) { //首先对互斥信号量进行加锁 pthread_mutex_lock(&b->lock); while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { printf("wait for not full\n"); //如果已经满了,则等待消费者读取了数据后发出“非满”信号。 pthread_cond_wait(&b->notfull, &b->lock); } b->buffer[b->writepos] = data; //更新writepos到下一个位置 b->writepos++; //循环利用缓冲区空间,如果超过了最大值,则从头开始。 if (b->writepos >= BUFFER_SIZE) b->writepos = 0; pthread_cond_signal(&b->notempty); //对互斥信号进行解锁。 pthread_mutex_unlock(&b->lock); } int get(struct prodcons * b) { int data; //对互斥信号量进行加锁 pthread_mutex_lock(&b->lock); while (b->writepos == b->readpos) { printf("wait for not empty\n"); pthread_cond_wait(&b->notempty, &b->lock); } data = b->buffer[b->readpos]; //更新readpos到下一个位置。 b->readpos++; //循环利用缓冲区,回拨指针 if (b->readpos >= BUFFER_SIZE) b->readpos = 0; pthread_cond_signal(&b->notfull); //对互斥信号量进行解锁 pthread_mutex_unlock(&b->lock); return data; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
莱芜市莱城区牛泉镇西泉河幼儿园地址在哪,我
停车场(空明东路)地址在哪,我要去那里办事
JOVISION监控摄像机安装不久后它变成自动全屏
40×60的枕头在上下铺的床枕应该不小吧,小嘛
根据现代生物进化理论,下列各项叙述中正确的
中行网银首次怎么用、我用户名,密码都没错。
因为工作原因,公司离男朋友住的地方很近,所
艾特熊和赛娜鼠片头音乐跟哪首歌很想
【洞庭湖诗句】关于洞庭湖的著名诗句有哪些
停车场(桂林海关南)地址在什么地方,想过去办
莱芜市莱城区方下镇乔家义幼儿园地址在哪,我
手机连不上宿舍的无线
停车场(毛塘路)地址有知道的么?有点事想过去
ALL SOUTHERN STARS 的中文翻译
带着牙套,是现在去面试还是再等等,4个建议
推荐资讯
蒸得香在什么地方啊,我要过去处理事情
我和我女朋友在一起不知道说什么她很内向的
面试京东客服 上的技校函授大专可以吗?
这件斗篷合适多少岁人穿?23岁可以吗?
中国古代民间有哪些关于莲花的传说?
已知一次函数y=3(x+2)+4,则它的图像在y轴上的
中石油(胜利路)地址有知道的么?有点事想过去
洪仔专业摩托车保养服务店地址有知道的么?有
求一部电影,魔幻的,几个人去森林里探秘一个
梦见租的房租被小偷什么都偷走了
拍脑袋是什么意思
怎么查旧邮票的价格 上海邮票回收价格
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?