linux下的哲学家问题 这里的sleep和usleep的功能各是什么啊 挂起的话执行的是什么操作啊

ZJ729286823 2015-07-20 04:07:57
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>

#define PHILOSOPHER_NUM 5
#define THINKING 1
#define HUNGRY 2
#define DINING 3


sem_t semph[PHILOSOPHER_NUM]; // 每个叉子有一个信号量
pthread_mutex_t mutex; // Mutex for printing



void* philosopher(void* param);

int main(int argc, char* argv[])
{
int i;
srand(getpid());
pthread_t PhilosopherThread[PHILOSOPHER_NUM]; //定义线程数组
int phId[PHILOSOPHER_NUM];
pthread_mutex_init(&mutex, NULL);
for (i=0; i<PHILOSOPHER_NUM; i++)
{
phId[i] = i;
//对每个叉子信号量进行初始化为当前进程的局部信号量
sem_init(&semph[i], 0, 1);
//以philosopher为原型创建PHILOSOPHER_NUM个线程
pthread_create(&PhilosopherThread[i], NULL, philosopher, (void*)(&phId[i]));
usleep(5000);
}
sleep(30);
return 0;
}



void* philosopher(void* param)
{
int myid;
char stateStr[128];
char mystate;
int ret;
unsigned int leftFork;
unsigned int rightFork;
myid = *((int*)(param));
printf("philosopher %d begin ....\n", myid);
usleep(1000000);

// 初始状态为THINKING
mystate = THINKING;
leftFork = (myid) % PHILOSOPHER_NUM;
rightFork = (myid + 1) % PHILOSOPHER_NUM;
while (1)
{
switch(mystate)
{
case THINKING:
// 改变状态
mystate = HUNGRY;
strcpy(stateStr, "HUNGRY");
break;
case HUNGRY:
strcpy(stateStr, "HUNGRY");
// 先测试左边叉子
ret = sem_trywait(&semph[leftFork]);
if (ret == 0)
{
// 左叉子可用, 拿起来 ,然后测试右边叉子 ...
ret = sem_trywait(&semph[rightFork]);
if (ret == 0)
{
// 右边叉子也可用 ! 改变我的状态
mystate = DINING;
strcpy(stateStr, "DINING");
}
else
{
// 右边叉子被别人使用, 放下左边叉子.
sem_post(&semph[leftFork]);
}
}
break;
case DINING:
// 放下左边和右边叉子
sem_post(&semph[leftFork]);
sem_post(&semph[rightFork]);
// 改变我的状态
mystate = THINKING;
strcpy(stateStr, "THINKING");
break;
}
// 打印我的状态
pthread_mutex_lock(&mutex);
printf("philosopher %d is : %s\n", myid, stateStr);
pthread_mutex_unlock(&mutex);


int sleepTime;
sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0));
usleep(sleepTime*100000);
}
}

我删除了最后的上面的sleeptime采用不是随机的时间,出现的结果却是差别很大。这里程序出现的各种sleep意义何在,请求指导一下。刚接触linux不太懂
...全文
165 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2015-07-21
  • 打赏
  • 举报
回复
引用 2 楼 ZJ729286823 的回复:
[quote=引用 1 楼 brookmill 的回复:] sleep和usleep的功能是一样的,都是休眠(挂起)一段时间。sleep的单位是秒,usleep的单位是微秒。本线程主动放弃执行,给其它线程执行的机会。对应哲学家放下叉子之后思考(也就是什么都不做)
int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0)); usleep(sleepTime*100000); 那这个随机时间的作用是什么啊 我换成一个确定的时间 就会显示完全不同的结果[/quote] 每个哲学家思考的时间都是随机的,这样才能体现出多线程问题的不确定性。换成确定的时间也是多线程的一种特例,有不同的结果也是正常的。
brookmill 2015-07-21
  • 打赏
  • 举报
回复
引用 4 楼 ZJ729286823 的回复:
main函数里面的sleep(30)作用是什么呢
我觉得他是想让主线程等所有子线程结束之后再退出。如果是这个目的,用pthread_join可能好一点
ZJ729286823 2015-07-21
  • 打赏
  • 举报
回复
main函数里面的sleep(30)作用是什么呢
ZJ729286823 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 brookmill 的回复:
sleep和usleep的功能是一样的,都是休眠(挂起)一段时间。sleep的单位是秒,usleep的单位是微秒。本线程主动放弃执行,给其它线程执行的机会。对应哲学家放下叉子之后思考(也就是什么都不做)
case HUNGRY: strcpy(stateStr, "HUNGRY"); // 先测试左边叉子 ret = sem_trywait(&semph[leftFork]); if (ret == 0) { // 左叉子可用, 拿起来 ,然后测试右边叉子 ... ret = sem_trywait(&semph[rightFork]); if (ret == 0) { // 右边叉子也可用 ! 改变我的状态 mystate = DINING; strcpy(stateStr, "DINING"); } else { // 右边叉子被别人使用, 放下左边叉子. sem_post(&semph[leftFork]); } 还有这个地方的第一个sem_trywait换成sem_trywait是不是会好点啊
ZJ729286823 2015-07-21
  • 打赏
  • 举报
回复
引用 1 楼 brookmill 的回复:
sleep和usleep的功能是一样的,都是休眠(挂起)一段时间。sleep的单位是秒,usleep的单位是微秒。本线程主动放弃执行,给其它线程执行的机会。对应哲学家放下叉子之后思考(也就是什么都不做)
int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0)); usleep(sleepTime*100000); 那这个随机时间的作用是什么啊 我换成一个确定的时间 就会显示完全不同的结果
brookmill 2015-07-20
  • 打赏
  • 举报
回复
sleep和usleep的功能是一样的,都是休眠(挂起)一段时间。sleep的单位是秒,usleep的单位是微秒。本线程主动放弃执行,给其它线程执行的机会。对应哲学家放下叉子之后思考(也就是什么都不做)

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧