52 lines
1.1 KiB
C++
52 lines
1.1 KiB
C++
#include <sys/types.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/sem.h>
|
|
#include <sys/wait.h>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <unistd.h>
|
|
|
|
union semun {
|
|
int val;
|
|
struct semid_ds *buf;
|
|
unsigned short *array;
|
|
struct seminfo *__buf;
|
|
} arg;
|
|
|
|
int semid;
|
|
|
|
void philosopher(int i) {
|
|
struct sembuf sbuf[2];
|
|
sbuf[0].sem_num = i;
|
|
sbuf[0].sem_flg = SEM_UNDO;
|
|
sbuf[1].sem_num = (i + 1) % 5;
|
|
sbuf[1].sem_flg = SEM_UNDO;
|
|
while (1) {
|
|
printf("philosopher %d is thinking\n", i);
|
|
sleep(2);
|
|
printf("philosopher %d is hungry\n", i);
|
|
sbuf[0].sem_op = -1;
|
|
sbuf[1].sem_op = -1;
|
|
semop(semid, sbuf, 2);
|
|
printf("philosopher %d is eating\n", i);
|
|
sleep(2);
|
|
sbuf[0].sem_op = 1;
|
|
sbuf[1].sem_op = 1;
|
|
semop(semid, sbuf, 2);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
key_t key = ftok("fname", 1);
|
|
semid = semget(key, 5, IPC_CREAT | 0666);
|
|
arg.val = 1;
|
|
for (int i = 0; i < 5; i++)
|
|
semctl(semid, i, SETVAL, arg);
|
|
for (int i = 0; i < 5; i++) {
|
|
if (fork() == 0) {
|
|
philosopher(i);
|
|
}
|
|
}
|
|
while (wait(NULL) > 0);
|
|
return 0;
|
|
} |