/*
关于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;
}
阅读(1700) | 评论(0) | 转发(0) |