Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2088553
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2008-12-17 21:25:13

/*
关于5个专家的故事,每人手中只有一根筷,
论流用别人筷子吃面,吃完面就还别人的
筷................
*/
#include //线程头文件
#include
#include//线程信号变量头文件
#include
#define N    5 //专家人数

pthread_mutex_t chopstick[N];
sem_t cn;
int x[5];
/*----------------- 拿起筷  ------------*/
void pick_up(int a)
{   
    sem_wait(&cn); //P操作: (cn-1) >0?  获取意资源
    pthread_mutex_lock(&chopstick[a]);//拿起右筷
    sleep(1);
    pthread_mutex_lock(&chopstick[(a + 4) % 5]);//拿起左筷
    sem_post(&cn);//放资源
}
/*---------------  放下筷 -------------*/
void put_down(int a)
{
    pthread_mutex_unlock(&chopstick[a]);
    pthread_mutex_unlock(&chopstick[(a + 4) % 5]);
}
/*----------论吃线程---------------*/
void *philosopher(void *arg)
{   
    int me = *(int*)arg;
    while(1){
        pick_up(me); //拿起筷子
        printf("%d eating %d\n", me, ++x[me]); //打印吃的状态
        usleep(1); //休眠1mS
        put_down(me); //放下筷子
        printf("%d thinking\n", me);  //打印思考状态
        usleep(1);
    }
    return NULL;   
}
/*------------- 主线程 -------------*/
int main()
{
    pthread_t tid[N];
    int i, arg[N];
    sem_init(&cn, 0, 4); //对信号变量进行初始化

    for(i = 0; i < N; i++)
    {
        arg[i] = i;
        pthread_mutex_init(&chopstick[i], NULL);  //初始化变量
    }

    for(i = 0; i < N; i++)         //并发N=5个线程
        pthread_create(&tid[i], NULL, philosopher, (void*)&arg[i]);

    for(i = 0; i < N; i++)   //等待5 个线程结束
        pthread_join(tid[i], NULL);
    return 0;
}
阅读(1651) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~