共计 1612 个字符,预计需要花费 5 分钟才能阅读完成。
信号量例子
#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); | |
} | |
} |
正文完