生产者消费者

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#include<pthread.h>
#include<sys/mman.h>
#include<sys/types.h>

#define BSIZE 10

typedef struct buffer_s {
    char buf[BSIZE];
    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 item) {
    pthread_mutex_lock(&b->mutex);
    while (b->occupied >= BSIZE)
        pthread_cond_wait(&b->less, &b->mutex);
    b->buf[b->nextin] = item;
    b->nextin++;
    b->nextin %= BSIZE;
    b->occupied++;
    pthread_cond_signal(&b->more);
    pthread_mutex_unlock(&b->mutex);
}

char consumer(buffer_t *b) {
    char item;
    pthread_mutex_lock(&b->mutex);
    while (b->occupied <= 0)
        pthread_cond_wait(&b->more, &b->mutex);
    item = b->buf[b->nextout];
    b->nextout++;
    b->nextout %= BSIZE;
    b->occupied--;
    pthread_cond_signal(&b->less);
    pthread_mutex_unlock(&b->mutex);
    return item;
}

void produce_driver(buffer_t *b) {
    char item;
    while (1) {
        item = getchar();
        if ('#' == item) {
            producer(b, '\0');
            break;
        } else {
            producer(b, (char)item);
        }
    }
}

void consume_driver(buffer_t *b) {
    char item;
    while (1) {
        item = consumer(b);
        if ('\0' == item)
            break;
        putchar(item);
    }
}

int main(int argc, char *argv[]) {
    int zfd;
    buffer_t *buffer;
    pthread_mutexattr_t mattr;
    pthread_condattr_t cattr_less, cattr_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(&cattr_less);
    pthread_condattr_setpshared(&cattr_less, PTHREAD_PROCESS_SHARED);
    pthread_cond_init(&buffer->less, &cattr_less);
    pthread_condattr_init(&cattr_more);
    pthread_condattr_setpshared(&cattr_more, PTHREAD_PROCESS_SHARED);
    pthread_cond_init(&buffer->more, &cattr_more);
    if (fork() == 0) {
        printf("this is child process:");
        consume_driver(buffer);
    } else { 
        printf("this is parent process:");
        produce_driver(buffer);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值