1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <pthread.h>
5
6 pthread_mutex_t x;
7 pthread_cond_t cv;
8 static int s=0;
9
10 int rand_num[100]={0};
11 int rd=0,wt=0;
12
13 void* threadConsumer(void* param)
14 {
15 int r;
16 int tid=*(int*)param;
17 while(1)
18 {
19 pthread_mutex_lock(&x);
20 while(s<=0)
21 {
22 printf("%u waiiting...\n",tid);
23 pthread_cond_wait(&cv,&x);
24 }
25 r = rd;
26 printf("%u get number %d %d\n",tid,r,rand_num[r]);
27 rand_num[r]=0;
28 rd=++rd%100;
29
30 s--;
31
32 pthread_mutex_unlock(&x);
33 usleep(0);
34 }
35
36 }
37
38 void* threadProduct(void* param)
39 {
40 int i=0;
41 rd=wt=0;
42
43 while(1)
44 {
45 unsigned int seed = time(NULL);
46 int left=0,left2;
47 pthread_mutex_lock(&x);
48
49 left=(wt>=rd)?(100-wt+rd):(rd-wt);
50 if(left==0||s==100)
51 {
52 pthread_mutex_unlock(&x);
53 usleep(0);
54 continue;
55 }
56
57 left2=left;
58
59 while(left>0)
60 {
61 rand_num[wt]=rand_r(&seed);
62 wt=++wt%100;
63 s++;
64 left--;
65 }
66 pthread_mutex_unlock(&x);
67
68 pthread_cond_broadcast(&cv);
69 printf("new add %d\n",left2);
70 usleep(0);
71 }
72 }
73
74 int main(int arc ,char** argv)
75 {
76 int i=0;
77 pthread_t tids[101]={0};
78 pthread_attr_t attr;
79
80 pthread_attr_init(&attr);
81
82 for(i=0;i<50;i++)
83 {
84 pthread_create(&tids[i],&attr,threadConsumer,(void*)(tids+i));
85 }
86
87 pthread_create(&tids[i],&attr,threadProduct,(void*)(tids+100));
88
89 pthread_join(tids[i],NULL);
90
91 return 0;
92
93 }