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

编制模拟“五个哲学家”问题的程序

一.实验目的

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

二.实验要求

1、程序语法

  philosopher   [ -t 

2、五个哲学家的编号为0~4,分别用五个进程独立模拟。

3、程序的输出要简洁,仅输出每个哲学家进餐和沉思的信息。例如,当编号为3的哲学家在进餐时,就打印:

  philosopher 3 is eating

而当他在沉思时,则打印:

   philosopher 3 is thinking

除此之外不要输出其他任何信息。

4、利用线程或IPC机制进行同步。

5、程序应该一直运行,直到人为地终止它(如按Ctrl-C或Ctrl-\)。不允许出现僵尸进程。

三.实验代码

#include
#include
#include 
#include
#include
#include
#include<string.h>
#include
#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-\时结束。

 

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

本程序为不带时间的运行方式。时间设置已经在内部设定。

六.说明:

1.分别设定各个哲学家的eating与thinking的值,再调用相应的函数进行区别,当然,在函数的编写过程当中,应当尽量避免函数中五个哲学家同时僵尸,而使程序出错。

2,程序与上一次发布的《哲学及问题》的一样。只是换成了线程的思路。

3. 通过这次试验学习和掌握并发线程同步的概念和方法。

 

转载于:https://www.cnblogs.com/xjx-user/archive/2012/12/05/2803031.html

你可能感兴趣的:(编制模拟“五个哲学家”问题的线程实现(unix操作系统系)---6)