分享

编程实现生产者消费者问题

 Linux学习模式 2014-11-02


  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <semaphore.h>  
  4. #include <unistd.h>  
  5.   
  6. void *producter_f (void * arg);  
  7. void *consumer_f (void *arg);  
  8.   
  9. sem_t empty;    //信号量 empty  
  10. sem_t full;     //信号量 full  
  11. int running = 1;  
  12.   
  13. int apple_num = 0;  
  14.   
  15. int main(void)  
  16. {  
  17.     pthread_t consumer_t;   //消费者  
  18.     pthread_t producter_t;  //生产者  
  19.   
  20.     //pshared表示信号量共享类型, 为 0时,表示只能在当前进程的  
  21.     //多个线程之间共享,不为 0 时,是可以和其他进程间共享该信号量  
  22.     //使用信号量,用来协作生产者和消费者的顺序,即实现同步效果  
  23.     sem_init (&empty,0,1);  //初始化empty信号量  
  24.     sem_init (&full,0,0);   //初始化full信号量  
  25.   
  26.     pthread_create(&consumer_t,NULL,consumer_f,(void*)&running);    //创建消费者线程  
  27.     pthread_create(&producter_t,NULL,producter_f,(void *)&running); //创建生产者线程  
  28.   
  29.     //sleep(1);       //睡眠 3 秒  
  30.     usleep(1000);   //睡眠10微秒  
  31.   
  32.     running = 0;  
  33.   
  34.     pthread_join(consumer_t,NULL);  
  35.     pthread_join(producter_t,NULL);  
  36.     sem_destroy(&empty);  
  37.     sem_destroy(&full);  
  38.     return 0;  
  39. }  
  40. void *producter_f(void *arg)  
  41. {  
  42.     while(*(int*)arg)  
  43.     {  
  44.         sem_wait(&empty);  
  45.         apple_num++;  
  46.         printf("producter 生产了第 %d 个苹果\n",apple_num);  
  47.         sem_post(&full);  
  48.         usleep(1);  
  49.     }  
  50. }  
  51.   
  52. void *consumer_f(void *arg)  
  53. {  
  54.     while(*(int *)arg)  
  55.     {  
  56.         sem_wait(&full);  
  57.         printf("consumer 消费了第 %d 个苹果\n",apple_num);  
  58.         sem_post(&empty);  
  59.         usleep(1);  
  60.     }  
  61. }  

运行结果截图:



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多