Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82501
  • 博文数量: 40
  • 博客积分: 1820
  • 博客等级: 上尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-26 16:12
文章分类

全部博文(40)

文章存档

2011年(8)

2010年(32)

我的朋友

分类:

2010-05-13 16:13:06

2.3 经典IPC问题
2.3.1 哲学家进餐问题

#define N 5 /*哲学家数目*/
#define LEFT (i+N-1)%N /*i的左边号码*/
#define RIGHT (i+1)%N /*i的右边号码*/
#define THINKING 0 /*哲学家正在思考*/
#define HUNGRY 1 /*哲学家想取得叉子*/
#define EATING 2 /*哲学家在进餐*/
typedef int semaphore; /*信号量是一个特殊的整型变量*/
int state[N]; /*哲学家的状态*/
semaphore mutex = 1; /*临界区互斥*/
semaphore s[N]; /*每个哲学家一个信号量*/

void philosopher(int i) {
    while (TRUE) {
        think();
        take_forks(i); /*需要两把叉子,或者阻塞*/
        eat();
        put_forks(i); /*放回叉子*/
    }
}

void take_forks(int i) {
    down(&mutex); /*进入临界区*/
    state[i] = HUNGRY; /*修改状态*/
    test(i); /*试图得到两把叉子*/
    up(&mutex); /*出临界区*/
    down(&s[i]); /*如果得不到叉子则阻塞。说明其邻居正在进餐,等待其邻居进餐完毕后
                                  执行test(LEFT)和test(RIGHT)*/

}

void put_forks(int i) {
    down(&mutex);
    state[i] = THINKING;
    test(LEFT);
    test(RIGHT);
    up(&mutex);
}

void test(int i) {
    if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) {
        state[i] = EATING;
        up(s[i]);
    }
}



2.3.2 读者-写者问题

typedef int semaphore;
semaphore mutex=1; /*互斥对rc的访问*/
semaphore db=1; /*互斥读者和写者对数据库的访问*/
int rc=0;

void reader(void){
    while(TRUE){
        down(&mutex);
        rc=rc+1;
        if(rc==1) down(&db); /*如果是第一个读者,则阻塞之后的写者*/
        up(&mutex);
        read_data_base();
        down(&mutex);
        rc=rc-1;
        if(rc==0) up(&db); /*如果是最后一个读者,解开对写者的互斥*/
        up(&mutex);
        use_data_base();
    }
}

void writer(void){
    while(TRUE){
        down(&db); /*阻塞读者的访问*/
        write_data_base();
        up(&db);
    }
}



阅读(419) | 评论(0) | 转发(0) |
0

上一篇:第2章 进程-2

下一篇:第2章 进程-4

给主人留下些什么吧!~~