unix 多进程下的生产者和消费者实现

#include<iostream.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include<time.h>
#include<unistd.h>
#include <semaphore.h>
#include<sys/mman.h>

typedef struct
{
        int buf[129];
        int occupied;
        int nextin;
        int nextout;
        pthread_mutex_t mutex;
        pthread_cond_t more;
        pthread_cond_t less;
} buffer_t;

void producer(buffer_t *b,char c)
{
        pthread_mutex_lock(&(b->mutex));

        if(b->occupied > 128)
        {
                pthread_cond_wait(&(b->less),&(b->mutex));
        }

        b->buf[b->nextin++]=c;
        b->nextin=b->nextin%128;
        b->occupied++;

        pthread_cond_signal(&(b->more));
        pthread_mutex_unlock(&(b->mutex));
}

void producer_driver(buffer_t *b)
{
        char item;
        while (1)
        {
                item = getchar();
                if (item == EOF)
                {
                        producer(b,'/0');
                        break;
                }
                else
                {
                        producer(b, (char)item);
                        sleep(0.5);
                }
        }
}

char consumer(buffer_t *b)
{
        char c;
        pthread_mutex_lock(&(b->mutex));
        if(b->occupied <= 0)
        {
                pthread_cond_wait(&(b->more),&(b->mutex));
        }

        c=b->buf[b->nextout++];
        b->nextout=b->nextout%128;
        b->occupied--;

        pthread_cond_signal(&(b->less));
        pthread_mutex_unlock(&(b->mutex));

        return c;
}

void consumer_driver(buffer_t *b)
{
        char item;
        while (1)
        {
                if ((item = consumer(b))=='/0')
                {
                        break;
                }

                putchar(item);
                sleep(1);
                //item = consumer(b);
                //cout<<item<<endl;
                //cout.flush();
        }
}


int main()
{
        int zfd;
        buffer_t *buffer;
        pthread_mutexattr_t mattr;
        pthread_condattr_t cvattr_less, cvattr_more;

        zfd = open("/dev/zero", O_RDWR);
        buffer = (buffer_t *)mmap(NULL, sizeof(buffer_t),
        PROT_READ|PROT_WRITE, MAP_SHARED, zfd, 0);

        buffer->occupied = buffer->nextin = buffer->nextout = 0;

        pthread_mutexattr_init(&mattr);
        pthread_mutexattr_setpshared(&mattr,PTHREAD_PROCESS_SHARED);
        pthread_mutex_init(&buffer->mutex, &mattr);

        pthread_condattr_init(&cvattr_less);
        pthread_condattr_setpshared(&cvattr_less, PTHREAD_PROCESS_SHARED);
        pthread_cond_init(&buffer->less, &cvattr_less);

        pthread_condattr_init(&cvattr_more);
        pthread_condattr_setpshared(&cvattr_more,PTHREAD_PROCESS_SHARED);
        pthread_cond_init(&buffer->more, &cvattr_more);

        if (fork() == 0)
        {
                consumer_driver(buffer);
        }
        else
        {
                producer_driver(buffer);
        }

        sleep(120);
        exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值