#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
//定义创建信号量
sem_t car;
sem_t door;
/*
1、初始信号量都为0,默认起始状态,车停门开;
2、司机一直等待车门关闭;
3、售票员关闭车门 ++door,开始在车上售票;
4、车门关闭后,司机开始开车,--door;
----到此door重新归零,汽车启动,售票员开始售票,售票员售完票需要等待司机停车才能开门
5、司机停车,++car;
6、售票员开车门,--car;
----到此car重新置零,所有状态回到刚开始的其实状态;
*/
void* drivecar(void* argc) {
while (1)
{
sleep(1);
//未关车门,在此等待车门的关闭
//acquire semaphore
sem_wait(&door);
//等到车门关闭 信号 --door
printf("(%lu)start car\n", pthread_self());
sleep(1);
printf("(%lu)car running\n", pthread_self());
sleep(1);
printf("(%lu)car stop\n", pthread_self());
sleep(1);
//release semaphore
//到达终点,要停车了 ++car
sem_post(&car);
break;
}
pthread_exit(0);
}
void* opendoor(void* argc) {
while (1)
{
printf("(%lu)close door\n", pthread_self());
sleep(1);
//acquire semaphore
//关闭车门后,信号 ++door
sem_post(&door);
printf("(%lu)sold...\n", pthread_self());
sleep(1);
//在此等待停车
sem_wait(&car);
//停车后打开车门 信号 --car
printf("(%lu)open door\n", pthread_self());
sleep(1);
//release semaphore
break;
}
pthread_exit(0);
}
int main(int argc, char const *argv[]) {
pthread_t tid[2];
//初始化信号量
sem_init(&car, 0, 0);
sem_init(&door, 0, 0);
pthread_create(tid + 0, NULL, drivecar, NULL);
pthread_create(tid + 1, NULL, opendoor, NULL);
for (size_t i = 0; i < 2; i++)
{
pthread_join(tid[i], NULL);
}
//销毁信号量
sem_destroy(&car);
sem_destroy(&door);
return 0;
}