用信号量解决哲学家就餐问题
来源:互联网 发布:手机淘宝买不了运费险 编辑:程序博客网 时间:2024/06/16 09:25
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>
#include <sys/mman.h>#include <string.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>#define ERR_EXIT(m)\do\{\perror(m);\exit(EXIT_FAILURE);\}while(0)int semid;#define DELAY (rand() % 5 + 1 )union semun { int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET
unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */ };}int sem_p(int semid){struct sembuf sb = {0,-1,0};int ret = semop(semid, &sb,1);if (ret == -1)ERR_EXIT("sem_p");return ret;}int sem_v(int semid){struct sembuf sb = {0,1,0};int ret = semop(semid, &sb,1);if (ret == -1)ERR_EXIT("sem_p");return ret;}void wait_for_2fork(int no){int left = no;int right = (no+1)%5;struct sembuf sb[2] = {{left, -1, 0},{right, -1, 0}};semop(semid, sb, 2);}void free_2fork(int no){int left = no;int right = (no+1)%5;struct sembuf sb[2] = {{left, 1, 0},{right, 1, 0}};semop(semid, sb, 2);}void philosophere(int no){srand(getpid());for (;;){printf("%d is thinking!\n", no);sleep(DELAY);printf("%d is hungry!\n", no);wait_for_2fork(no);printf("%d is eating!\n", no);sleep(DELAY);free_2fork(no);}}int main(int argc, char *argv[]){semid = semget(IPC_PRIVATE, 5, IPC_CREAT | 0666);if (semid == -1)ERR_EXIT("semget");union semun su;su.val = 1;int i;for (i = 0; i < 5; i++){semctl(semid,i ,SETVAL,su);}pid_t pid;int no;for (i = 0; i < 5; i++){pid = fork();if (pid == -1)ERR_EXIT("fork");if (pid == 0){no = i;break;}}philosophere(no);return 0;}
阅读全文
0 0
- 用信号量解决哲学家就餐问题
- [Unix系统编程]用信号量实现哲学家就餐问题
- Eilxir解决哲学家就餐问题
- 哲学家就餐-信号量
- linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题
- linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题
- 哲学家就餐问题Java版解决案
- 哲学家就餐问题——and型信号量机制
- 用Java模拟哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题 锁
- 哲学家就餐问题
- 哲学家就餐问题
- 关于哲学家就餐问题
- 哲学家就餐问题
- 哲学家就餐问题
- <%%>,<%=%>,<%#%>的理解
- 文章标题
- Leetcode238. O(n)并且不能使用除法计算数组每个元素除了它本身的所有元素的积
- JAVA 10.28.2017
- 二叉树的基本操作(C语言版)
- 用信号量解决哲学家就餐问题
- 今非昔比,谁还记得10年前的中日无人机风波?
- 这是一个在机器人创业浪潮中诞生的创客大赛
- [剑指offer]算法8 青蛙跳台阶问题
- Swift学习笔记(7)——数组
- OPPO R9首销成绩出色 线上线下超过10万台
- Facebook上曝光腾讯将启动WiFi卫星计划
- 阿里VR实验室携手大朋VR愚人节“放大招”
- 【ChinaBang Awards 2016】再一次发现中国创新的力量