zoukankan      html  css  js  c++  java
  • 生产者、消费者 C源码,gcc编译通过

    /*生产者、消费者*/
    #include<stdio.h>
    #include<pthread.h>
    #define BUFFER_SIZE 16
    /***struct prodcons***/
    struct prodcons
    {
    int buffer[BUFFER_SIZE];
    pthread_mutex_t lock;
    int readpos,writepos;
    pthread_cond_t notempty;
    pthread_cond_t notfull;

    };

    void init(struct prodcons *b)
    {
    pthread_mutex_init(&b->lock,NULL);
    pthread_cond_init(&b->notempty,NULL);
    pthread_cond_init(&b->notfull,NULL);
    b->readpos = 0;
    b->writepos = 0;

    }

    void put(struct prodcons *b,int data)
    {
    pthread_mutex_lock(&b->lock);
    if((b->writepos+1)%BUFFER_SIZE == b->readpos)
    {
    pthread_cond_wait(&b->notfull,&b->lock);
    }
    b->buffer[b->writepos] = data;
    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);
    if(b->writepos == b->readpos)
    {
     pthread_cond_wait(&b->notempty,&b->lock);

    }
    data = b->buffer[b->readpos];
    b->readpos++;
    if(b->readpos >=BUFFER_SIZE)
    b->readpos = 0;
    pthread_cond_signal(&b->notfull);
    pthread_mutex_unlock(&b->lock);
    return data;
    }

    /***test***/
    #define OVER (-1)
    struct prodcons buffer;
    void *producer(void *data)
    {
    int n;
    for(n = 0;n<10000;n++)
    {
    printf("%d---> ",n);
    put(&buffer,n);

    }
    put(&buffer,OVER);
    return NULL;

    }

    void *consumer(void *data)
    {
    int d;
    while(1)
    {
    d = get(&buffer);
    if(d == OVER)
    break;
    printf("--->%d ",d);

    }
    return NULL;

    }

    int main(void)
    {

    pthread_t th_a,th_b;
    void *retval;
    init(&buffer);
    pthread_create(&th_a,NULL,producer,0);
    pthread_create(&th_b,NULL,consumer,0);
    pthread_join(th_a,&retval);
    pthread_join(th_b,&retval);
    return 0;

    }

  • 相关阅读:
    第4章-控制执行流程
    第3章-运算符
    第2章-对象
    第10章-内部类II
    第10章-内部类
    基于gtest、gmock、mockcpp和lcov的C语言LLT工程 —— LLT构造和lcov查看覆盖率实例
    字符设备驱动框架讲解
    基于Hadoop分布式集群YARN模式下的TensorFlowOnSpark平台搭建
    给 Virtualbox 中 Ubuntu 系统设置静态 IP
    小白请教几个关于Java虚拟机内存分配策略的问题
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310766.html
Copyright © 2011-2022 走看看