• 生产者消费者


    #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!
    ",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
    ",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);
    
    
    
    
    
    }
  • 相关阅读:
    Heap(堆)和stack(栈)有的区别是什么。
    i++和++i的深入理解
    JDBC之java数据库的连接与简单的sql语句执行
    java前三本基础知识总结
    数据库的一些基础
    SQL 同时查看2个表
    JMeter 问题
    Linux 常用命令
    java io (一)
    验证密码必须是字母加数字的组合
  • 原文地址:https://www.cnblogs.com/wzben/p/5418702.html
Copyright © 2020-2023  润新知