您的位置:首页 > 其它

编制模拟“五个哲学家”问题的线程实现(unix操作系统系)---6

2013-08-26 12:54 435 查看
编制模拟“五个哲学家”问题的程序
一.实验目的

学习和掌握并发进程同步的概念和方法。

二.实验要求

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. 通过这次试验学习和掌握并发线程同步的概念和方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐