永发信息网

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

答案:1  悬赏:60  手机版
解决时间 2021-01-25 13:49
  • 提问者网友:暗中人
  • 2021-01-24 22:00
求大神加上注释,越详细越好 #include <stdio.h> #include <stdlib
最佳答案
  • 五星知识达人网友:逐風
  • 2021-01-24 22:58
首先这是一个生产者和消费者问题。生产者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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯