实验1:司机和售票员问题
#include
#include
#include
#include
sem_t d;
sem_t c;
void* Driver(void* arg)
{ sem wait(&d);
printf("开车\n");
printf("正常行车\n");
printf("到站停车\n");
sem_post(&c);
pthread_exit(0);
}
void* Conductor(void* arg)
{
printf("关车门\n");
sem_post(&d);
printf("售票\n");
sem wait(&c);
printf("开车门\n");
pthread_exit(0);
}
int main(int* argc, char const* argv[])
{
sem_init(&d, 0, 0);
sem_init(&c ,0, 0);
pthread_t Tid[2];
pthread_create(Tid, NULL, Conductor, NULL);
pthread_create(Tid+1 ,NULL, Driver, NULL);
pthread_join(Tid[0], NULL);
pthread_join(Tid[1], NULL);
sem_destroy(&d);
sem_destroy(&c);
return 0;
}
这里让两辆车并发,我们会发现结果会出问题,这里是因为两辆车是上车售票下车关着门这一系列事件是互斥的,所以需要进一步优化,我这里不优化了,继续优化需要更详细的模型,大家可以试下
优化互斥,大家可以解决一下
同步案例
读者-写者问题:
核心规则:不可以同时读和写(竞争),读者与读者之间不冲突(同步),写者与写者之间也竞争
伪代码
理发师问题
规则图片中只有一个理发师,理发师一个时刻只能帮一个人剪头发,其他人需要坐在数量有限的椅子上
哲学家就餐问题
哲学家们,只有同时拿到左边和右边的筷子才可以吃饭,除了吃饭其他事件都在思考。