📄 philosopher.c
字号:
#include "lock.h"
#include "lock.c"
#include "apue.h"
#define N 5
int nsecs=2;
static char * forks[5] = {"fork0", "fork1", "fork2", "fork3", "fork4"};
void philosopher(int i);
void takeFork(int i);
void putFork(int i);
void thinking (int i,int nsecs);
void eating(int i,int nsecs);
int main(int argc,char *argv[])
{
int i;
pid_t pid;
if(argc==3&&strcmp(argv[1],"-t")==0)
nsecs=atoi(argv[2]);
for(i=0;i<N;i++)
{
initlock(forks[i]);
}
for(i = 0; i < N; i++) {
pid = fork();
if( pid == 0 )
philosopher(i);
}
wait(NULL); /* 注意,如果父进程不等待子进程的结束,那么需要终止程序运行时,
就只能从控制台删除在后台运行的哲学家进程 */
return 0;
}
void philosopher(int i)
{
while(1) {
thinking(i, nsecs); // 哲学家i思考nsecs秒
takeFork(i); // 哲学家i拿起叉子
eating(i, nsecs); // 哲学家i进餐nsecs秒
putFork(i); // 哲学家i放下叉子
}
}
void takeFork(int i)
{
if( i == N - 1 ) {
lock( forks[0] );
lock( forks[i] );
}
else {
lock( forks[i] );
lock( forks[i + 1] );
}
}
void putFork(int i)
{
if( i == N - 1 ) {
unlock( forks[0] );
unlock( forks[i] );
}
else {
unlock( forks[i] );
unlock( forks[i + 1] );
}
}
void thinking (int i,int nsecs)
{
printf("philosopher %d is thinking!\n",i);
sleep(nsecs);
}
void eating(int i,int nsecs)
{
printf("philosopher %d is eating!\n",i);
sleep(nsecs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -