编制模拟“五个哲学家”问题的程序
一.实验目的
学习和掌握并发进程同步的概念和方法。
二.实验要求
1、程序语法
philosopher [ -t <time> ]
<time>是哲学家进餐和沉思的持续时间值,虚拟主机,缺省值为2秒。
2、五个哲学家的编号为0~4,分别用五个进程独立模拟。
3、程序的输出要简洁,仅输出每个哲学家进餐和沉思的信息。例如,当编号为3的哲学家在进餐时,香港虚拟主机,就打印:
philosopher 3 is eating
而当他在沉思时,则打印:
philosopher 3 is thinking
除此之外不要输出其他任何信息。
4、利用线程或IPC机制进行同步。
5、程序应该一直运行,直到人为地终止它(如按Ctrl-C或Ctrl-\)。不允许出现僵尸进程。
三.实验代码
#include<sys/types.h>#include<semaphore.h>#include <pthread.h>#include<sys/stat.h>#include<malloc.h>#include<fcntl.h>#include<string.h>#include<unistd.h>#includeN 5//pthread_t pt[5];//sem_t bin_sem[5];pthread_t *pt;sem_t *bin_sem;int num_=0;putFork(int i);void thinking(int i,int nsecs);void eating(int i,int nsecs);void takeFork(int i);void* philosopher(void *str){int nsecs=2;char *ptr;ptr=str;int i=atoi(ptr);i=num_;printf(,i);while(1) {thinking(i, nsecs); // 哲学家i思考nsecs秒takeFork(i);// 哲学家i拿起叉子eating(i, nsecs);// 哲学家i进餐nsecs秒putFork(i);// 哲学家i放下叉子 }}int main(int argc,char *argv[]){int res,err;int i=0;pid_t pid;pt=(pthread_t*) calloc(N,sizeof(pthread_t));bin_sem=(sem_t*) calloc(N,sizeof(sem_t));for(i = 0; i < N; i++) {res=sem_init(&bin_sem[i],1,1);}for(i = 0; i < N; i++) {char abc[10];sprintf(abc,,i);err = pthread_create(&pt[i], NULL,philosopher,abc);if (err != 0)err_quit(, strerror(err));num_++;sleep(1);}sleep(100);}void takeFork(int i){if( i == N – 1 ) {sem_wait(&bin_sem[0]);sem_wait(&bin_sem[i]);}else {sem_wait(&bin_sem[i]);sem_wait(&bin_sem[i+1]);}}void putFork(int i){if( i == N – 1 ) {sem_post(&bin_sem[0]);sem_post(&bin_sem[i]);}else {if(i%2==0){sem_post(&bin_sem[i]);sem_post(&bin_sem[i+1]);}else{sem_post(&bin_sem[i+1]);sem_post(&bin_sem[i]);}}}void thinking(int i,int nsecs){sleep(1);printf(,i,nsecs);}void eating(int i,int nsecs){sleep(1);printf(,i,nsecs);
四.实验结果:
1.编译原文件:
2.实验结果
执行./so,直到按Ctrl-C或Ctrl-\时结束。
本程序为不带时间的运行方式。时间设置已经在内部设定。
六.说明:
1.分别设定各个哲学家的eating与thinking的值,香港服务器,再调用相应的函数进行区别,当然,在函数的编写过程当中,应当尽量避免函数中五个哲学家同时僵尸,而使程序出错。
2,程序与上一次发布的《哲学及问题》的一样。只是换成了线程的思路。
3.通过这次试验学习和掌握并发线程同步的概念和方法。
见过旅行风景,就这样,慢慢学会了长大。