编制模拟“五个哲学家”问题的线程实现(unix操作系统系)---6
编制模拟“五个哲学家”问题的程序
一.实验目的
学习和掌握并发进程同步的概念和方法。
二.实验要求
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> #include"apue.h" #define N 5 //pthread_t pt[5]; //sem_t bin_sem[5]; pthread_t *pt; sem_t *bin_sem; int num_=0; //sem_t *bin_sem; void 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("now value of i is:%d\n",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,"%d",i); err = pthread_create(&pt[i], NULL,philosopher,abc); if (err != 0) err_quit("can't create thread: %s\n", 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("philosopher:%d are thinking:%d second\n",i,nsecs); } void eating(int i,int nsecs) { sleep(1); printf("philosopher:%d are eating:%d second\n",i,nsecs);
四.实验结果:
1.编译原文件:
2.实验结果
执行./so,直到按Ctrl-C或Ctrl-\时结束。
本程序为不带时间的运行方式。时间设置已经在内部设定。
六.说明:
1.分别设定各个哲学家的eating与thinking的值,再调用相应的函数进行区别,当然,在函数的编写过程当中,应当尽量避免函数中五个哲学家同时僵尸,而使程序出错。
2,程序与上一次发布的《哲学及问题》的一样。只是换成了线程的思路。
3. 通过这次试验学习和掌握并发线程同步的概念和方法。