线程同步:生产者与消费者模型

线程同步:生产者与消费者模型


今天上课做项目时讲到了线程同步的知识,记录在此,已备下次查阅。
生产线程:随机产生大写字母A-Z,并放入数组。
消费线程:弹出数组最大下标的字母。
其他细节详见代码。

/*************************************************************************
    > 文 件 名: cond.c
    > 程 序 猿: 无痕 
    > E - MAIL: zhaoye410@vip.qq.com
    > 创建时间: Wed 04 Mar 2015 09:15:18 AM CST
 ************************************************************************/

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

#define MAX_STOCK 5 //最大库存容量
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){
    char const* who=(const char*)arg;
    for(;;){
        pthread_mutex_lock(&g_mtx); //锁上
        if(g_stock>=MAX_STOCK) {
            //仓库已满,等待仓库非满
            printf("\033[;;32m%s:仓库爆满,停止生产!\033[0m\n",who);
            pthread_cond_wait(&g_full,&g_mtx); //阻塞,等仓库放空,并释放锁定的共享资源(仓库)
        }
        char prod=rand()%26+'A';
        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* coustomer(void *arg){
    const char* who=(char*)arg;
    for(;;){
        pthread_mutex_lock(&g_mtx);
        if(!g_stock){
            //仓库为空了
            printf("\033[;;31m%s:仓库空了,停止消费!\033[0m\n",who);
            pthread_cond_wait(&g_empty,&g_mtx); //仓库空了,停止消费
        }
        char prod=g_storage[--g_stock]; //仓库提货
        show(who,"->",prod);

        //已消费,唤醒生产者
        pthread_cond_signal(&g_full);

        //phread_cond_broadcast(&g_full) //使用broadcast广播,需要把上面的if判断改成while循环

        pthread_mutex_unlock(&g_mtx);
        usleep((rand()%100)*1000);
    }
}

int main(int argc,char **argv,char **env)
{
    pthread_t tid;
    pthread_create(&tid,NULL,producer,"生产者1");
    pthread_create(&tid,NULL,coustomer,"消费者1");
    pthread_create(&tid,NULL,producer,"生产者2");
    pthread_create(&tid,NULL,coustomer,"消费者2");
    getchar();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值