操作系统实验——哲学家进餐问题

    技术2024-03-23  108

    代码在gcc上实现

    #include <stdio.h> #include <pthread.h> #include <errno.h> #include<unistd.h> pthread_mutex_t chopstick[6]; void *eat_think(void *arg) { char philosopher = *(char *)arg; int left, right; switch (philosopher) { case 'A': left = 5; right = 1; break; case 'B': left = 1; right = 2; break; case 'C': left = 2; right = 3; break; case 'D': left = 3; right = 4; break; case 'E': left = 4; right = 5; break; } int i; while (1) { sleep(2); pthread_mutex_lock(&chopstick[left]); printf("Philosopher %c gets chopstick %d\n", philosopher, left); if (pthread_mutex_trylock(&chopstick[right]) == EBUSY) { pthread_mutex_unlock(&chopstick[left]); continue; } printf("Philosopher %c gets chopstick %d\n", philosopher, right); printf("Philosopher %c is eating.\n", philosopher); sleep(2); pthread_mutex_unlock(&chopstick[left]); printf("Philosopher %c release chopstick %d\n", philosopher, left); pthread_mutex_unlock(&chopstick[right]); printf("Philosopher %c release chopstick %d\n", philosopher, right); } } int main() { pthread_t A, B, C, D, E; int i; for (i = 0; i < 5; i++) pthread_mutex_init(&chopstick[i], NULL); pthread_create(&A, NULL, eat_think, "A"); pthread_create(&B, NULL, eat_think, "B"); pthread_create(&C, NULL, eat_think, "C"); pthread_create(&D, NULL, eat_think, "D"); pthread_create(&E, NULL, eat_think, "E"); pthread_join(A, NULL); pthread_join(B, NULL); pthread_join(C, NULL); pthread_join(D, NULL); pthread_join(E, NULL); return 0; }

    Processed: 0.009, SQL: 9