信号量例子

#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <errno.h>sem_t remain, apple, pear, mutex;static unsigned int vremain = 20, vapple = 0, vpear = 0;void *father(void *);void *mother(void *);void *son(void *);void *daughter(void *);void print_sem();int main(){    pthread_t fa, ma, so, da;    sem_init(&remain, 0 , 20);    sem_init(&apple, 0, 0);    sem_init(&pear, 0, 0);    sem_init(&mutex, 0, 1);    pthread_create(&fa, NULL, &father, NULL);    pthread_create(&ma, NULL, &mother, NULL);    pthread_create(&so, NULL, &son, NULL);    pthread_create(&da, NULL, &daughter, NULL);    while(1) {        sem_wait(&mutex);        printf("apple: %u, pear: %u, left: %u\n", vapple, vpear, vremain);        sem_post(&mutex);        sleep(1);    }}void *father(void *arg){    while(1) {        sem_wait(&remain);        sem_wait(&mutex);        printf("father: put before, left = %u, apple = %u\n", vremain, vapple);        vremain --;        vapple ++;        printf("father: put after, left = %u, apple = %u\n\n", vremain, vapple);        sem_post(&mutex);        sem_post(&apple);        sleep(1);    }}void *son(void *arg){    while(1) {        sem_wait(&apple);        sem_wait(&mutex);        printf("son: take before, left = %u, apple = %u\n", vremain, vapple);        vremain ++;        vapple --;        printf("son: put after, left = %u, apple = %u\n\n", vremain, vapple);        sem_post(&mutex);        sem_post(&remain);        sleep(3);    }}void *mother(void *arg){    while(1) {        sem_wait(&remain);        sem_wait(&mutex);        printf("mother: put before, left = %u, pear = %u\n", vremain, vpear);        vremain --;        vpear ++;        printf("mother: put after, left = %u, pear = %u\n\n", vremain, vpear);        sem_post(&mutex);        sem_post(&pear);        sleep(3);    }}void *daughter(void *arg){    while(1) {        sem_wait(&pear);        sem_wait(&mutex);        printf("dau: take before, left = %u, pear = %u\n", vremain, vpear);        vremain ++;        vpear --;        printf("dau: take after, left = %u, pear = %u\n\n", vremain, vpear);        sem_post(&mutex);        sem_post(&remain);        sleep(1);    }}