一、链接库
二、线程
三、信号量
a、sem_init()
b、 sem_wait()
四、互斥锁与条件变量
a、关系
实例
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_FRUITS 4
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t father_cv = PTHREAD_COND_INITIALIZER;
pthread_cond_t mother_cv = PTHREAD_COND_INITIALIZER;
pthread_cond_t sons_cv = PTHREAD_COND_INITIALIZER;
pthread_cond_t daughters_cv = PTHREAD_COND_INITIALIZER;
int num_fruits = 0;
void* father(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (num_fruits >= MAX_FRUITS) {
pthread_cond_wait(&father_cv, &mutex);
}
num_fruits++;
printf("盘子中有%d个苹果,父亲往盘子放1个苹果!\n", num_fruits);
pthread_cond_signal(&sons_cv);
pthread_cond_signal(&daughters_cv);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* mother(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (num_fruits >= MAX_FRUITS) {
pthread_cond_wait(&mother_cv, &mutex);
}
num_fruits++;
printf("盘子中有%d个橘子,母亲往盘子放1个橘子!\n", num_fruits);
pthread_cond_signal(&sons_cv);
pthread_cond_signal(&daughters_cv);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* son(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (num_fruits == 0) {
pthread_cond_wait(&sons_cv, &mutex);
}
num_fruits--;
printf("盘子中有%d个苹果,大儿子从盘子取1个苹果!\n", num_fruits);
pthread_cond_signal(&father_cv);
pthread_cond_signal(&mother_cv);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void* daughter(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (num_fruits == 0) {
pthread_cond_wait(&daughters_cv, &mutex);
}
num_fruits--;
printf("盘子中有%d个橘子,大女儿从盘子取1个橘子!\n", num_fruits);
pthread_cond_signal(&father_cv);
pthread_cond_signal(&mother_cv);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t father_thread, mother_thread, son_thread, daughter_thread;
pthread_create(&father_thread, NULL, father, NULL);
pthread_create(&mother_thread, NULL, mother, NULL);
pthread_create(&son_thread, NULL, son, NULL);
pthread_create(&daughter_thread, NULL, daughter, NULL);
pthread_join(father_thread, NULL);
pthread_join(mother_thread, NULL);
pthread_join(son_thread, NULL);
pthread_join(daughter_thread, NULL);
return 0;
}