生产者消费者模型的代码实现(Linux环境)

本文通过C语言实现了一个典型的生产者消费者问题。利用多线程技术,演示了生产者不断生成产品并放入仓库,而消费者从仓库取出产品的过程。通过互斥锁和条件变量保证线程间的同步和等待。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 *生产者消费者问题
 * */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#define MAX_STOCK 20//仓库容量
char g_storage[MAX_STOCK];
size_t g_stock=0;//当前库存
//互斥量
pthread_mutex_t g_mtx=PTHREAD_MUTEX_INITIALIZER;
//条件变量
pthread_cond_t g_full=PTHREAD_COND_INITIALIZER;//满仓
pthread_cond_t g_empty=PTHREAD_COND_INITIALIZER;//空仓
//显示库存
void show(const char*who,const char*op,char prod)
{
    printf("%s:",who);
    size_t i;
    for(i=0;i<g_stock;++i)
      printf("%c",g_storage[i]);
    printf("%s%c\n",op,prod);
}
//生产者线程
void *producer(void*arg)
{
    const char *who=(const char*)arg;
    for(;;)
    {
    pthread_mutex_lock (&g_mtx);
    if(g_stock>=MAX_STOCK)
    {
        printf("%s:满仓\n",who);
        pthread_cond_wait(&g_full,&g_mtx);
     
    }  
        char prod='A'+rand()%26;
        show(who,"<-",prod);
        g_storage[g_stock++]=prod;
        pthread_cond_signal(&g_empty);
        pthread_mutex_unlock(&g_mtx);
        usleep((rand()%100)*1000);
    }
    return NULL;
}
//消费者线程
void*customer(void*arg)
{
//  usleep(10000);
    const char*who=(const char*)arg;
    for(;;)
    {
        pthread_mutex_lock(&g_mtx);
        if(!g_stock)
        {
            printf("%s:空仓!\n",who);
            pthread_cond_wait(&g_empty,&g_mtx);
        }
      char prod=g_storage[--g_stock];
    show(who,"->",prod);
    pthread_cond_signal(&g_full);//即使没有等待的线程也返回成功
    pthread_mutex_unlock(&g_mtx);
    usleep((rand()%100)*1000);
    }
    return NULL;
}
int main(){
    srand(time(NULL));
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    pthread_t tid;
    pthread_create(&tid,&attr,producer,"生产者");
    pthread_create(&tid,&attr,customer,"消费者");
    getchar();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9号信箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值