首页 > 其他 > 详细

生产者消费者

时间:2016-04-21 21:41:10      阅读:271      评论:0      收藏:0      [点我收藏+]
#include <pthread.h>  
#include <semaphore.h>
#include <unistd.h>  
#include <stdio.h>
#include<fcntl.h>
#include <pthread.h>
#include <errno.h>


//文件锁,buffer锁,empty和full信号量
sem_t file_mutex,buf_mutex,empty,full;

int offset = 0;

char buffer[256];

void producer(int i){

    int k = 0;    

    while(k<8){

    sem_wait(&empty);
    sem_wait(&buf_mutex);
    sem_wait(&file_mutex);
    
    //从源文件读取
    int fd = open("./source.txt",O_RDWR);
    lseek(fd,offset,SEEK_SET);
    read(fd,buffer,1);
    printf("Producer %d is working!\n",i);
    k++;
    offset++;
    

    sem_post(&file_mutex);
    sem_post(&buf_mutex);
    sem_post(&full);
    usleep(10);

    }
    



}


void consumer(int i){

    int k = 0;

    while(k<5){

    sem_wait(&full);
    sem_wait(&buf_mutex);
    
    //从buffer中取数据,打印
    printf("Consumer %d printfs %s\n",i,buffer);
    k++;
    
    
    sem_post(&buf_mutex);
    sem_post(&empty);
    usleep(10);


    }

}

int main(){

    sem_init(&file_mutex, 0, 1);
    sem_init(&buf_mutex, 0, 1);
    sem_init(&full, 0, 0);
    sem_init(&empty, 0, 5);

    pthread_t pro1,pro2,pro3,con1,con2,con3,con4;

    
    //3个生产者,4个消费者。
    pthread_create(&pro1,NULL,(void*)producer,1);
    pthread_create(&pro2,NULL,(void*)producer,2);
    pthread_create(&pro3,NULL,(void*)producer,3);
    pthread_create(&con1,NULL,(void*)consumer,1);
    pthread_create(&con2,NULL,(void*)consumer,2);
    pthread_create(&con3,NULL,(void*)consumer,3);
    pthread_create(&con4,NULL,(void*)consumer,4);


    pthread_join(pro1,NULL);
    pthread_join(pro2,NULL);
    pthread_join(pro3,NULL);
    pthread_join(con1,NULL);
    pthread_join(con2,NULL);
    pthread_join(con3,NULL);
    pthread_join(con4,NULL);





}

 

生产者消费者

原文:http://www.cnblogs.com/wzben/p/5418702.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!