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;

    }

  • 相关阅读:
    PhpStorm中如何调整字体大小
    PhpStorm-2017.1.2破解步骤
    Eclipse/MyEclipse 最最常用的快捷键
    Invalid result location value/parameter
    系统重装--相关问题
    喜马拉雅||亲爱的,慢慢行走
    QQ聊天界面模式切换
    myeclipse中如何修改项目的名称
    软考-程序设计语言基础(编译原理)
    软考-计算机组成原理、体系机构与网络安全
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310766.html
Copyright © 2011-2022 走看看