1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <pthread.h>
6 #include <errno.h>
7 #include <string.h>
8 #include <semaphore.h>
9
10 #define ERR_EXIT(m)
11 do
12 {
13 perror(m);
14 exit(EXIT_FAILURE);
15 }while(0)
16
17 #define CONSUMER_COUNT 1
18 #define PRODUCE_COUNT 2
19
20 #define BUFFSIZE 10
21 int g_buffer[BUFFSIZE];
22
23 unsigned short in = 0;
24 unsigned short out = 0;
25 unsigned short produce_id = 0;
26 unsigned short consume_id = 0;
27
28 sem_t g_sem_full;
29 sem_t g_sem_empty;
30
31 pthread_mutex_t g_mutex;
32
33 pthread_t g_thread[CONSUMER_COUNT+PRODUCE_COUNT];
34
35 void* consume(void* arg)
36 {
37 int num= (int*)arg;
38 int i;
39 while(1)
40 {
41 printf("%d wait buffer not empty
",num);
42 sem_wait(&g_sem_empty);
43 pthread_mutex_lock(&g_mutex);
44
45 for(i = 0; i< BUFFSIZE; i++)
46 {
47 printf("%02d ",i);
48 if(g_buffer[i] == -1)
49 printf("%s","null");
50 else
51 printf("%d",g_buffer[i]);
52 if(i == out)
53 printf(" <--consume");
54 printf("
");
55 }
56
57 consume_id = g_buffer[out];
58 printf("%d begin consume product %d
",num, consume_id);
59 g_buffer[out] = -1;
60 out = (out + 1)%BUFFSIZE;
61 printf("%d end consume produce %d
",num,consume_id);
62
63 pthread_mutex_unlock(&g_mutex);
64 sem_post(&g_sem_full);
65 sleep(1);
66 }
67 return NULL;
68 }
69
70 void* produce(void* arg)
71 {
72 int num = (int*)arg;
73 int i;
74 while(1)
75 {
76 printf("%d wait buffer not full
",num);
77 sem_wait(&g_sem_full);
78 pthread_mutex_lock(&g_mutex);
79
80 for(i = 0; i< BUFFSIZE; i++)
81 {
82 printf("%02d ",i);
83 if(g_buffer[i] == -1)
84 printf("%s","null");
85 else
86 printf("%d",g_buffer[i]);
87 if(i == in)
88 printf(" <--produce");
89 printf("
");
90 }
91
92 printf("%d begin produce product %d
",num, produce_id);
93 g_buffer[in] = produce_id;
94 in = (in + 1)%BUFFSIZE;
95 printf("%d end produce produce %d
",num,produce_id++);
96
97 pthread_mutex_unlock(&g_mutex);
98 sem_post(&g_sem_empty);
99 sleep(1);
100 }
101 return NULL;
102 }
103
104 int main(void)
105 {
106 int i;
107 for(i = 0; i < BUFFSIZE;i++)
108 g_buffer[i] = -1;
109 sem_init(&g_sem_full, 0, BUFFSIZE);
110 sem_init(&g_sem_empty, 0, 0);
111
112 pthread_mutex_init(&g_mutex,NULL);
113
114 for(i = 0; i< CONSUMER_COUNT; i++)
115 {
116 pthread_create(&g_thread[i], NULL,consume, (void*)i);
117 }
118
119 for(i = 0; i< PRODUCE_COUNT; i++)
120 {
121 pthread_create(&g_thread[i], NULL,produce, (void*)i);
122 }
123
124 for(i = 0; i < CONSUMER_COUNT + PRODUCE_COUNT; i++)
125 {
126 pthread_join(g_thread[i],NULL);
127 }
128
129
130 pthread_mutex_destroy(&g_mutex);
131 sem_destroy(&g_sem_full);
132 sem_destroy(&g_sem_empty);
133
134
135 return 0;
136 }