0
点赞
收藏
分享

微信扫一扫

Linux线程---生产者消费者模型

朱小落 2022-02-27 阅读 121

一、进程互斥与同步
进程互斥与同步机制的主要任务是:对多个相关进程在执行次序上进行协调,使并发执行的诸进程间能按照一定的规则(或时序)共享系统资源,并能很好的相互合作,从而使程序能够正确执行。
在多个进程共享资源或为完成某一任务而相互合作时,可能存在以下两种形式的制约关系:
(1)间接相互制约关系(互斥)
多个程序并发执行时,要对临界资源进行共享,所以只能互斥的访问临界资源,这些进程间就形成了间接制约关系。
(2)直接相互制约关系(同步)
多个进程间为完成某一共同任务时必须合作进行。比如一个进程用于输入数据,另一进程用于计算数据,只有输入进程拿到数据之后,计算进程才可进行计算,也就是说输入进程完成后才可进行计算进程,即输入进程直接制约着计算进程。
由于上述两种制约关系的存在,必须对临界资源的访问和进程的执行次序进行协调,保证各进程按次序执行,这就是进程的互斥与同步概念。
二. 生产者消费者问题
该问题就是一个著名的进程同步问题。它描述的是:一群生产者进程正在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程和消费者进程能够并发执行。在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将生产的产品放入缓冲区中,消费者进程从缓冲区中取走产品进行消费。
生产者在投放产品时,消费者不能去取产品。消费者在取产品时,生产者不能投放产品。 即对缓冲区必须互斥的使用。
只有生产者往缓冲区中投放了产品,消费者才可取走消费,而不能在空缓冲区中取走产品。同理,当缓冲区满了的时候只有消费者进程取走产品后,生产者进程才可继续投放产品,而不能对满了的缓冲区投放产品。 所以生产者进程与消费者进程之间必须同步。
所以,可以利用信号量实现对临界资源(缓冲区)的维护。
三、实现思路
在这里插入图片描述
四、实例

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

struct msg
{
        int num;
        struct msg *next;
};
struct msg *head=NULL;
pthread_mutex_t mutex;
pthread_cond_t cond;
void *handler_pro(void *arg)
{
        while(1){
                struct msg *new=malloc(sizeof(struct msg));
                new->num=rand()%1000+1;
                printf("--product--%d\n",new->num);
                pthread_mutex_lock(&mutex);
                new->next=head;
                head=new;
                pthread_mutex_unlock(&mutex);
                pthread_cond_signal(&cond);
                sleep(rand()%3);
        }
}

void *handler_con(void *arg)
{
        while(1){
				struct msg *new;
                pthread_mutex_lock(&mutex);
                if(head==NULL){
                        pthread_cond_wait(&cond,&mutex);
                }
                new=head;
                head=new->next;
                printf("consumer:%d\n",new->num);
                free(new);
                pthread_mutex_unlock(&mutex);
                sleep(rand()%3);
        }
}
int main()
{
        pthread_t pro;
        pthread_t con;
        int *pret=NULL;
        pthread_mutex_init(&mutex,NULL);
        pthread_cond_init(&cond,NULL);
        int ret;
        ret=pthread_create(&pro,NULL,handler_pro,NULL);
        if(ret!=0){
                perror("pro");
                exit(-1);
        }

        ret=pthread_create(&con,NULL,handler_con,NULL);
         if(ret!=0){
                perror("pro");
                exit(-1);
        }
        pthread_join(pro,(void **)&pret);
        pthread_join(con,(void **)&pret);
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
        return 0;
}                                                                                                              

五、运行结果
在这里插入图片描述
可以看到生产者生产的数据,消费者都会一一读取。

举报

相关推荐

0 条评论