编制模拟“五个哲学家”问题的线程实现(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. 通过这次试验学习和掌握并发线程同步的概念和方法。

 

posted @ 2012-12-05 14:26  xjx_user  阅读(437)  评论(0编辑  收藏  举报