生产者-消费者问题linux下C语言实现(转-CNKing)

这是我转载的第一篇文章,代码我在gcc下运行过了,没有任何问题;以后我会尽量多写一些原创的文章,和大家分享自己学习中的一点一滴。

          代码:(?2012 观心苑 http://hi.baidu.com/shazi129/item/4d2a054626be7d17896d1088

 

  1 /*
  2 * author 张文
  3 * 2008/06/20
  4 */
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 #include <unistd.h>
  8 #include <pthread.h>
  9 #include <semaphore.h>
 10 #define N 2   // 消费者或者生产者的数目
 11 #define M 10 // 缓冲数目
 12 int in = 0;   // 生产者放置产品的位置
 13 int out = 0; // 消费者取产品的位置
 14 int buff[M] = {0}; // 缓冲初始化为0, 开始时没有产品
 15 sem_t empty_sem; // 同步信号量, 当满了时阻止生产者放产品
 16 sem_t full_sem;   // 同步信号量, 当没产品时阻止消费者消费
 17 pthread_mutex_t mutex; // 互斥信号量, 一次只有一个线程访问缓冲
 18 int product_id = 0;   //生产者id
 19 int prochase_id = 0; //消费者id
 20 /* 打印缓冲情况 */
 21 void print()
 22 {
 23 int i;
 24 for(i = 0; i < M; i++)
 25    printf("%d ", buff[i]);
 26 printf("\n");
 27 }
 28 /* 生产者方法 */ 
 29 void *product()
 30 {
 31 int id = ++product_id;
 32 
 33 while(1)
 34 {
 35    // 用sleep的数量可以调节生产和消费的速度,便于观察
 36    sleep(1);
 37    //sleep(1);
 38   
 39    sem_wait(&empty_sem);
 40    pthread_mutex_lock(&mutex);
 41   
 42    in = in % M;
 43    printf("product%d in %d. like: \t", id, in);
 44   
 45    buff[in] = 1;  
 46    print();  
 47    ++in;
 48   
 49    pthread_mutex_unlock(&mutex);
 50    sem_post(&full_sem);  
 51 }
 52 }
 53 /* 消费者方法 */
 54 void *prochase()
 55 {
 56 int id = ++prochase_id;
 57 while(1)
 58 {
 59    // 用sleep的数量可以调节生产和消费的速度,便于观察
 60    sleep(1);
 61 //sleep(1);
 62   
 63    sem_wait(&full_sem);
 64    pthread_mutex_lock(&mutex);
 65   
 66    out = out % M;
 67    printf("prochase%d in %d. like: \t", id, out);
 68   
 69    buff[out] = 0;
 70    print();
 71    ++out;
 72   
 73    pthread_mutex_unlock(&mutex);
 74    sem_post(&empty_sem);
 75 }
 76 }
 77 int main()
 78 {
 79 pthread_t id1[N];
 80 pthread_t id2[N];
 81 int i;
 82 int ret[N];
 83 
 84 // 初始化同步信号量
 85 int ini1 = sem_init(&empty_sem, 0, M); 
 86 int ini2 = sem_init(&full_sem, 0, 0);  
 87 if(ini1 && ini2 != 0)
 88 {
 89    printf("sem init failed \n");
 90    exit(1);
 91 } 
 92 //初始化互斥信号量 
 93 int ini3 = pthread_mutex_init(&mutex, NULL);
 94 if(ini3 != 0)
 95 {
 96    printf("mutex init failed \n");
 97    exit(1);
 98 } 
 99 // 创建N个生产者线程
100 for(i = 0; i < N; i++)
101 {
102    ret[i] = pthread_create(&id1[i], NULL, product, (void *)(&i));
103    if(ret[i] != 0)
104    {
105     printf("product%d creation failed \n", i);
106     exit(1);
107    }
108 }
109 //创建N个消费者线程
110 for(i = 0; i < N; i++)
111 {
112    ret[i] = pthread_create(&id2[i], NULL, prochase, NULL);
113    if(ret[i] != 0)
114    {
115     printf("prochase%d creation failed \n", i);
116     exit(1);
117    }
118 }
119 //销毁线程
120 for(i = 0; i < N; i++)
121 {
122    pthread_join(id1[i],NULL);
123    pthread_join(id2[i],NULL);
124 }
125 exit(0); 
126 }

 

          编译:gcc -o NAME NAME.c -lpthread  或者  gcc  NAME.c  -o NAME -lpthread

          运行:./NAME

 

生产者-消费者问题linux下C语言实现(转-CNKing),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。