信号量:表示可用资源的数量,MUTEX是非0即为1的,
即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同!
调用sem_wait()可以获得资源(P操作),使semaphore的值减1,如果调用sem_wait()时
semaphore的值已经是0,则挂起等待。如果不希望挂起等待,可以调用sem_trywait() 。调用
sem_post() 可以释放资源(V操作),使semaphore 的值加1,同时唤醒挂起等待的线程。
1.生产者不会把消费者套个圈
2.消费者不会超过生产者
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<pthread.h>
4 #include<semaphore.h>
5 #define SIZE 20
6 sem_t sem_blank,sem_data;
7 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
8 pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
9 int array[SIZE];
10 void* produce(void* arg)
11 { int i=0;
12 while(1)
13 {
14 pthread_mutex_lock(&mutex1);
15 sem_wait(&sem_blank);
16 i=i%SIZE;
17 array[i]=rand()%100;
18 printf("product:tid:%ld,val:%d\n",pthread_self(),array[i]);
19 sem_post(&sem_data);
20 pthread_mutex_unlock(&mutex1);
21 i++;
22 sleep(1);
23 }
24 return NULL;
25 }
26 void* consume(void* arg)
27 {
28 int j=0;
29 while(1)
30 {
31 pthread_mutex_lock(&mutex2);
32 sem_wait(&sem_data);
33 j=j%SIZE;
34 int consu=array[j];
35 printf("consumer:tid:%ld,val:%d\n",pthread_self(),consu);
36 sem_post(&sem_blank);
37 pthread_mutex_unlock(&mutex2);
38 ++j;
39 sleep(1);
40 }
41 return NULL;
42 }
43 int main()
44 {
45 pthread_t product1,consumer2,product2,consumer1;
46 pthread_create(&product1,NULL,produce,NULL);
47 pthread_create(&consumer1,NULL,consume,NULL);
48 pthread_create(&product2,NULL,produce,NULL);
49 pthread_create(&consumer2,NULL,consume,NULL);
50
51 sem_init(&sem_blank,0,SIZE);
52 sem_init(&sem_data,0,0);
53
54 sem_destroy(&sem_blank);
55 sem_destroy(&sem_data);
56 pthread_join(product1,NULL);
57 pthread_join(consumer1,NULL);
58 pthread_join(product2,NULL);
59 pthread_join(consumer2,NULL);
60 pthread_mutex_destroy(&mutex1);
61 pthread_mutex_destroy(&mutex2);
62 return 0;
63 }
结果:
[admin@localhost SEM_DATA]$ ./sem_data
product:tid:-1237722256,val:83
consumer:tid:-1248212112,val:83
product:tid:-1216742544,val:86
consumer:tid:-1227232400,val:86
product:tid:-1237722256,val:77
consumer:tid:-1248212112,val:77
product:tid:-1216742544,val:15
consumer:tid:-1227232400,val:15
product:tid:-1237722256,val:93
consumer:tid:-1248212112,val:93
product:tid:-1216742544,val:35
consumer:tid:-1227232400,val:35
product:tid:-1237722256,val:86
consumer:tid:-1248212112,val:86
product:tid:-1216742544,val:92
consumer:tid:-1227232400,val:92
product:tid:-1237722256,val:49
consumer:tid:-1248212112,val:49
product:tid:-1216742544,val:21
本文出自 “liveyoung” 博客,转载请与作者联系!