实验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; }
这里让两辆车并发,我们会发现结果会出问题,这里是因为两辆车是上车售票下车关着门这一系列事件是互斥的,所以需要进一步优化,我这里不优化了,继续优化需要更详细的模型,大家可以试下
优化互斥,大家可以解决一下
同步案例
读者-写者问题:
核心规则:不可以同时读和写(竞争),读者与读者之间不冲突(同步),写者与写者之间也竞争
伪代码
理发师问题
规则图片中只有一个理发师,理发师一个时刻只能帮一个人剪头发,其他人需要坐在数量有限的椅子上
哲学家就餐问题
哲学家们,只有同时拿到左边和右边的筷子才可以吃饭,除了吃饭其他事件都在思考。