信号量:表示可用资源的数量,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