⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 philosopher.c

📁 模拟“五个哲学家”问题该实验的要点是
💻 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 + -