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;

    }

  • 相关阅读:
    CSS学习笔记07 盒子模型
    [Android]AndFix使用说明
    [Android]自定义控件LoadMoreRecyclerView
    [算法]Plus One
    [Android]android Service后台防杀
    [Android]android studio预览视图时报错
    [算法]删除无序单链表中值重复出现的节点
    [算法] 将单链表的每K个节点之间逆序
    [Android]热修复框架AndFix测试说明
    [算法]单链表的选择排序
  • 原文地址:https://www.cnblogs.com/riskyer/p/3310766.html
Copyright © 2011-2022 走看看