操作系统哲学家就餐问题——定义一个互斥信号量mutex

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <errno.h>


#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>


union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *_buf;
};


#define ERR_EXIT(m) \
do { \
perror(m); \
exit(EXIT_FAILURE); \
} while(0)
//wait操作
void wait_a(int semid,int num)
{
struct sembuf sb={num,-1,0};
semop(semid,&sb,1);
}
//signal操作
void signal_a(int semid,int num)
{
struct sembuf sb={num,1,0};
semop(semid,&sb,1);
}
#define DELAY (rand() % 5 + 1)
//ph函数
void ph(int num,int semid,int semid0)
{
int left=num;
int right=(num+1)%5;
for(;;)
{
printf("%d is thinking\n",num);
sleep(DELAY);
printf("%d is hungry\n",num);
sleep(DELAY);
//wait操作,控制哲学家最多4人能进餐
//wait_mutex(semid0);
wait_a(semid0,0);
printf("%d get mutex \n",num);
wait_a(semid,left);
wait_a(semid,right);
//wait_rightcs(semid,right);
printf("%d is eating\n",num);
sleep(DELAY);
//signal_mutex(semid0);//释放互斥信号量
signal_a(semid0,0);
//signal_mutex(semid0);
//signal操作
//signal_leftcs(semid,left);//释放左快子
//signal_rightcs(semid,right);//释放右筷子
signal_a(semid,right);
signal_a(semid,left);//释放左快子


}
}
//主函数
int main(int argc,char *argv[])
{
int semid,semid0;
//创建两个信号量集
semid0=semget(IPC_PRIVATE,1,IPC_CREAT | 0666);
semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);
//
union semun su;
su.val=1;
int i;
for(i=0;i<5;i++)
{
//注意第二个参数也是索引
//semctl()系统调用在一个信号量集(或集合中的单个信号量)上执行各种控制操作
semctl(semid,i,SETVAL,su);
}
//设定semid0信号量的初始值
union semun su0;
su0.val=4;
semctl(semid0,0,SETVAL,su0);
//创建4个子进程
int num=0;
pid_t pid;
for(i=1;i<5;i++)
{
pid=fork();
if(pid<0) {ERR_EXIT("fork");}
if(pid==0) {num=i;break;}
}
//第num个哲学家要做的事
ph(num,semid,semid0);
return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值