打印

强烈要求大家都来讨论!如何解决解决哲学家吃饭问题

[复制链接]
楼主: singleywy
手机看帖
扫描二维码
随时随地手机跟帖
81
123jj| | 2011-3-24 05:01 | 只看该作者 回帖奖励 |倒序浏览
...
123 jj  下面又要动用版主的权利,为了天下第一的 XX,删刘前辈此贴了。——太明显了吧。
刘前辈 发表于 2011-3-23 21:00


刘前辈刘专家刘大超人,这次你真的错了。 :L

俺可不是什么版主,匠人曾经提拨俺,但给网友们否定了。
老X支持俺申请版主,但看了水mm对版主的要求:“版主每月原创帖不少于2篇。”
俺退缩了,要知道,chunyang和maychang两位老师,不说每月,每年的原创帖都拿不出2篇!最多拿点创新贴出来,不过两位老师最大的功德就是不断的抄冷饭-----抄录点书本上前人的经验和知识,指导一下新人菜鸟。如严格执行水mm对版主的要求,chunyang和maychang这两位老师也得下课~~~ :P

因此,俺不是什么版主,请刘前辈嘴下留情,别整天拿版主来嘲笑俺。
俺有自知自明,匠人的力升太低了,水mm的要求太高了~~~~
蛋定,蛋定,俺还是做个小P民灌灌水逍遥自在~~~ :victory:

使用特权

评论回复
82
123jj| | 2011-3-24 05:17 | 只看该作者
本帖最后由 123jj 于 2011-3-24 05:19 编辑
单核上所谓并行都是伪并行,总会有一个线程会比其他特别一点点,因为不可能做到绝对的平等。5个人吃的一样多也不能证明 5 个人是绝对的平等。...
highgear 发表于 2011-3-23 22:30


事实上,多核上并发运行,能做到每个线程绝对的平等,如前面俺提到的台湾8核八位单片机,能同时独立运行八个线程八道程序,但在绝对的平等面前,对5个哲学家绝对平均用餐问题上,也OUT了。
因为,5个哲学家,使用绝对相同的方法(算法),同时取餐叉,必定每一位哲学家都吃不到,都得饿死,进入死锁等待状态~~~

使用特权

评论回复
83
刘前辈| | 2011-3-24 09:19 | 只看该作者
本帖最后由 刘前辈 于 2011-3-24 10:52 编辑


单核上所谓并行都是伪并行,总会有一个线程会比其他特别一点点,因为不可能做到绝对的平等。5个人吃的一样多也不能证明 5 个人是绝对的平等。


所长我说句真话,我现在看着你心里真着急!“总有一个线程会比其他特别一点点,……”没错呀,但是你不知道是哪个线程!在这一时刻,也许是线程A先运行推进,下一时刻又可能是线程B跑到了前面,没有说谁谁谁总是固定比别人先跑或总是跑在前面的!这就叫并发程序的异步(随机)特性。——固定顺序那叫裸奔,纯粹的裸奔,由程序员操控进度的;不叫OS并发!如果哲学家就餐问题让所长编程到最后成了——你所长让谁先吃谁就先吃,你所长让谁最后吃谁就必须最后吃,那岂不成了笑话?——那OS还管理谁???!!!老顽童你玩裸奔呢。总在这计算思考谁先谁后。并发任务根本没有固定顺序(所谓异步是什么意思都没弄清呢),(除了前趋任务组)怎么调度是OS调度算法的事,不用程序员操心的。 ——OS把程序员的负担简单化了,所以借助OS,菜鸟也可以编制出高手程序。所长对自己一生的努力眼看没什么意义白干了,懊丧之极。年轻人借助工具,轻易就超过你。这是什么时代。老年人拼命返古也无力回天。)     

       什么叫交会?什么叫屏障?是OS里为了对异步并发的一组任务无序推进速度的一种控制。裸奔里没有的。

      所长和123jj 总是清晰地知道5个哲学家在某一时刻的行为状态,总在那里玩裸奔高手。昨天还在吹自己的程序运行起来 0号吃得多,4号吃得少;今天又意识到自己的露怯小儿科,又改变说法啦?“总有一个线程与其他特别一点点……”谁啊,0号?1号?4号?不多,就那么一点点。——又不是爱因斯坦啦……

       仔细看看LZ 殷文跃怎么写的,别人怎么就能“完美轮转”?到了所长这就不是撑死就是饿死。玩了一辈子代码,还没小辈写得好。惭愧。

使用特权

评论回复
84
刘前辈| | 2011-3-24 09:35 | 只看该作者
本帖最后由 刘前辈 于 2011-3-24 10:48 编辑

算啦。不废话了。告诉您所长的程序错在哪里:再仔细看看题目,就餐的是5个哲-学-家,——不是5头猪;哲学家的主要任务是思考think( )。一个哲学家在2 顿饭之间要think( )工作至少4小时,无论中国、外国,一天都是三顿饭,没谁吃了又接着要吃的。

转过弯了没有?

        无论谁先占有2把叉子先开吃,1小时吃完时间够了吧;(还有可能和另一个饿着的人同时开吃,例如:0-2号同时,4-1号同时等等。)然后让出叉子给另外4个人,完后他干什么去?——继续工作think( ) ! 在至少4小时之内他根本不会再来与其他4个人竞争叉子!然后,在4小时之内,其他4个人并发也好,顺序也好,肯定能把这顿正餐吃完。后面还要我说么,
   
所以,5个人肯定都是在2顿饭之间同步完成这顿饭。——谁比谁多吃一顿的可能根本不存在!——根本不需要什么与众不同的一点点优先级之类,谁先开吃都行,(谁先投入运行都行)最终结果是一致的。
       下一顿开吃就不一定是上面这个固定顺序了,例如可能是从2—4先开吃,——固定顺序那是裸奔!
   
     实验显示就是:在5个人都点亮过一次LED(2秒代表半小时)之后,所有灯全灭至少若干秒(直到下一顿开餐,另一轮异步新的顺序开始。);——这个若干秒是所有哲学家在think( )工作的时间。没有人肚子饿,一天只吃三顿,没有人不停地想竞争叉子吃饭的,撑死?

     所以,总有些人想显得自己比 Dijkstra 还要聪明厉害,结果连题意还没弄明白就已经把世界经典问题解了。“给他一点点优先级……”

    一场闹剧……









使用特权

评论回复
85
gys123456| | 2011-3-24 10:43 | 只看该作者
大家在讨论之中能学到很多的东西啊!算是长进了,

使用特权

评论回复
86
刘前辈| | 2011-3-24 11:14 | 只看该作者
本帖最后由 刘前辈 于 2011-3-24 11:37 编辑

看别人怎么写并发程序:5个哲学家一个模子,没谁先谁后。管你谁先启动,宏观微观,并行串行,——高手操心的事太多了吧。 OS早就替你做了。别把OS玩成裸奔!




忘了这一句,光想着怎么 eat 吃了。

使用特权

评论回复
87
hdp7891000| | 2011-3-24 13:47 | 只看该作者
mark,正想学操作系统呢,学完再来看,真刺激

使用特权

评论回复
88
aihe| | 2011-3-24 18:13 | 只看该作者
说实话,这个程序从表面上看是平等的
但是,如果你不能在你的OS中实现真正的随机数,你所说的平等是不现实的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
123jj + 1
89
aihe| | 2011-3-24 18:14 | 只看该作者
再说一句,刘很会断章取义混淆视听的说

使用特权

评论回复
90
123jj| | 2011-3-24 19:10 | 只看该作者
aihe老师正解!

顶一把~~~

使用特权

评论回复
91
123jj| | 2011-3-24 21:45 | 只看该作者
说实话,刘前辈刘大师的钻研精神让俺敬佩,就如同敬重这世上那些几十年如一日,致致不倦的刻苦钻研证明永动机确实存在的牛人们一样。

向致致不倦刻苦钻研的刘前辈刘大师致以崇高的革命敬礼。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
92
aihe| | 2011-3-24 22:39 | 只看该作者
顺便说一下,百米跑就算是在同一起跑线上起跑也不能说是绝对平等
要知道百米赛计数单位是秒,而精度通常是小数点后两位
而声波的传输速度是340m/s
假设离发令枪的第一个选手和第十个选手的距离差为9米,
那么对两个选手来说听到枪响时间差了0.026秒
所以说也是不平等的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
93
zhouwenbin1989| | 2011-3-24 22:50 | 只看该作者
都是要有点能力才能在两种论点的争论中占据一席之地啊,小弟我最近也研究了下实时系统,但是看了你们的观点看法,还是有很多不理解啊,看来自己要学的还有很多啊。佩服你们啊

使用特权

评论回复
94
highgear| | 2011-3-24 23:31 | 只看该作者
刘工的思路非常混乱, 看程序, 看什么程序, 贴几行毫无用处代码的片段只能说明你缺乏基本的逻辑思维能力。另外: Fork 是叉子, 不是筷子。

那一段代码源自于 Modern Operating Systems 一书:

#define N 5                /*number of philosophers*/
#define LEFT  (i+N-1)%N    /*i's left neighbour*/
#define RIGHT (i+1)%N      /*i's right neighbour*/
#define THINKING 0         /*philosopher is thinking*/
#define HUNGRY   1         /*philosopher is trying to get the forks*/
#define EATING   2         /*philosopher is eating*/
typedef int semaphore;     /*semaphores are special kind of integers*/
int state[N];              /*array to keep track of everyone's state*/
semaphore mutex;           /*mutual exclusion for critical regions (init 1)*/
semaphore s[N] ;           /*one semaphore per philosopher (init 0)*/

void philosopher(int i) {  /*i:philosopher number, from 0 to N-1*/
  while (TRUE) {           /*repeat forever*/
    think();               /*philosopher is thinking*/
    take_forks(i);         /*acquire two forks or block*/
    eat();                 /*yum-yum, spaghetti*/
    put_forks(i);          /*put both forks back on table*/
  }
}

void take_forks(int i) {   /*i:philosopher number, from 0 to N-1*/
  down(&mutex);            /*enter critical region*/
  state[i] = HUNGRY;       /*record fact that philosopher is hungry*/
  test(i);                 /*try to acquire 2 forks*/
  up(&mutex);              /*exit critical region*/
  down(&s[i]);             /*block if forks were not acquired*/
}

void put_forks(int i) {    /*i:philosopher number, from 0 to N-1*/
  down(&mutex);            /*enter critical region*/
  state[i] = THINKING;     /*philosopher has finished eating*/
  test (LEFT));            /*see if left neighbour can now eat*/
  test (RIGHT);            /*see if right neighbour can now eat*/
  up(&mutex);              /*exit critical region*/
}

void test (int i) {        /*i:philosopher number, from 0 to N-1*/
  if (state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING) {
    state[i] = EATING;
    up(&s[i]);
  }
}

使用特权

评论回复
95
123jj| | 2011-3-25 05:49 | 只看该作者
谢谢highgear老师提供完整程序,作者编写的真好,俺学习了。

使用特权

评论回复
96
hxy6951| | 2011-3-25 08:47 | 只看该作者
留意

使用特权

评论回复
97
肖敏123| | 2011-3-25 12:27 | 只看该作者
经典

使用特权

评论回复
98
aihe| | 2011-3-25 15:34 | 只看该作者
哈哈,100楼归我了

使用特权

评论回复
99
xtaylg| | 2011-3-28 09:09 | 只看该作者
兄弟,接着上呀!:$

使用特权

评论回复
100
liuxiang889| | 2011-3-28 10:42 | 只看该作者
学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则