philosopher.c

来自「模拟“五个哲学家”问题该实验的要点是」· C语言 代码 · 共 80 行

C
80
字号
#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 + =
减小字号Ctrl + -
显示快捷键?