Linux 系统应用编程——多线程经典问题(生产者-消费者)

 “生产者——消费者”问题是Linux多线程编程中的经典问题,主要是利用信号量处理线程间的同步和互斥问题。

         “生产者——消费者”问题描述如下:

          有一个有限缓冲区(这里用有名管道实现 FIFO 式缓冲区)和两个线程:生产者和消费者,它们分别不停地把产品放入缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也不IXUS等待。另外,因为缓冲区是临界资源,所以生产者和消费者之间必须互斥进行。它们之间的关系如下:


这里要求使用有名管道来模拟有限缓冲区,并用信号量来解决“生产者——消费者”问题中的同步和互斥问题。


1、信号量分析

        这里使用3个信号量,其中两个信号量 avail 和 full 分别用于解决生产者和消费者线程之间的互斥问题。其中avail 表示缓冲区的空单元数,初始值为N;full 表示缓冲区非空单元数,初始值为 0 ; mutex 是互斥信号量 ,初始值为 1(当然也可以用互斥锁来实现互斥操作)。

2、画出流程图


3、编写代码

        本实验的代码中缓冲区拥有3个单元,每个单元为5个字节。为了尽量体现每个信号量的意义,在程序中生产过程和消费过程是随机(采取0~5s 的随机事件间隔)进行的,而且生产者的速度比消费者的速度平均快两倍左右。生产者一次生产一个单元的产品(放入hello字符串),消费者一次消费一个单元的产品。

[cpp]  view plain   copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <unistd.h>  
  5. #include <pthread.h>  
  6. #include <sys/types.h>  
  7. #include <time.h>  
  8. #include <fcntl.h>  
  9. #include <semaphore.h>  
  10. #include <sys/ipc.h>  
  11. #include <errno.h>  
  12. #define MYFIFO "myfifo"  
  13. #define BUFFER_SIZE 3  
  14. #define UNIT_SIZE 5  
  15. #define RUN_TIME 30  
  16. #define DELAY_TIME_LEVELS 5.0  
  17.   
  18. void *producer(void *arg);  
  19. void *customer(void *arg);  
  20.   
  21. int fd;  
  22. time_t end_time;  
  23. sem_t mutex,full,avail;  
  24.   
  25. int main()  
  26. {  
  27.     int ret;  
  28.     pthread_t thrd_prd_id,thrd_cst_id;  
  29.   
  30.     srand(time(NULL));  
  31.     end_time = time(NULL) + RUN_TIME;  
  32.   
  33.         /*创建有名管道*/  
  34.     if((mkfifo(MYFIFO,0644) < 0) && (errno != EEXIST))  
  35.     {  
  36.         perror("mkfifo error!");  
  37.         exit(-1);  
  38.     }  
  39.   
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值