#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> void sleep_random(int t) { sleep((int)(t * (rand() / (RAND_MAX *1.0)))); } void delay(){ int i = 10000000; while (i--) ; } #define N 5 sem_t chopstick[N]; void *phi(void *id){ /* 'id' starts from 1 */ int i, left, right, myid = *(int*)id; left = myid - 1; right = (myid < N) ? myid : 0; for (i = 0; i < 3; i++){ printf("phi #%d: thinking\n", myid); if (left < right){ sem_wait(&chopstick[left]); delay(); sem_wait(&chopstick[right]); } else{ sem_wait(&chopstick[right]); delay(); sem_wait(&chopstick[left]); } printf("phi #%d: eating\n", myid); sleep_random(3); sem_post(&chopstick[left]); sem_post(&chopstick[right]); } } int main(){ int i, id[N]; pthread_t t[N]; srand((int)time(0)); for (i = 0; i < N; i++){ id[i] = i + 1; sem_init(&chopstick[i], 0, 1); } for (i = 0; i < N; i++) pthread_create(&t[i], NULL, phi, &id[i]); for (i = 0; i < N; i++) pthread_join(t[i], NULL); return 0; } 什么意思
时间: 2024-04-23 15:25:20 浏览: 102
用c语言实现的逆序文本程序
这是一个使用 pthread 和 semaphore 实现的哲学家就餐问题。程序模拟了 5 个哲学家围坐在一张圆桌前,每个哲学家需要使用他左右两边的筷子才能进餐。每个哲学家线程会先思考一段时间,然后尝试获取他左右两边的筷子,如果两个筷子都被占用,则等待。当哲学家成功获取两个筷子并进餐时,会持有两个筷子信号量,直到进餐结束后释放。主线程创建 5 个哲学家线程,并等待它们执行完毕。在程序中,使用了 5 个信号量 chopstick 来表示每个筷子的占用状态,初始时每个筷子都是可用的。当哲学家需要使用筷子时,会先尝试获取左右两边的筷子信号量,如果坐在 5 号位置的哲学家需要使用 1 号和 5 号两个筷子,则会先等待获取 5 号筷子的信号量,避免死锁。如果同时有多个哲学家都试图获取同一对筷子,可能会发生死锁,因此需要使用适当的算法,如 Dijkstra 算法来避免死锁。
阅读全文