打印

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

[复制链接]
楼主: singleywy
手机看帖
扫描二维码
随时随地手机跟帖
61
123jj| | 2011-3-21 14:23 | 只看该作者 回帖奖励 |倒序浏览
哲学家宣布人人生而平等。生物学家都知道这句话是不正确的。

无论测量人的体力或智力,我们都发现有极端的差别。而且我们知道文明进步纯出于少数杰出者的工作,其余的人只不过是摹仿与劳动而已。

使用特权

评论回复
62
123jj| | 2011-3-21 14:57 | 只看该作者
把“平等”作为社会追求的基本价值,是一个语言学的错误。是逻辑思维混乱的产物。

使用特权

评论回复
63
maychang| | 2011-3-21 15:02 | 只看该作者
63楼123jj:
看来,你对“平等”的认识还不够。
跑百米,所有选手都在一条线上起跑(平等),但到达终点一定有先有后。
或者,根据每个选手的速度,在不同位置起跑,设法让他们同时到达终点(平等)。
你认为哪个方法是平等的?

使用特权

评论回复
64
123jj| | 2011-3-21 15:24 | 只看该作者
本帖最后由 123jj 于 2011-3-21 15:26 编辑

谢谢maychang老师亲临指点。

俺对“平等”没有认识,如说有认识的话,认为一切事物没有绝对的“平等”,平等是相对的,不平等是永恒的。

63楼之言,纯粹是网上看到的,看看有点个性,摘录下供大伙讨论~~~
原文在:http://www.douban.com/group/topic/14325434/

使用特权

评论回复
65
aihe| | 2011-3-21 16:42 | 只看该作者
太绕口了,看得头昏脑胀,有点像白马非马

使用特权

评论回复
66
highgear| | 2011-3-21 21:02 | 只看该作者
刘工尚不能正确的理解LED亮度与刷新率的关系, 更何况“绝对平等”这类抽象的叙述。在绝对平等的环境里,5个哲学家会像拉封丹的驴子一样饿死,
.
.
这一点不会因为刘工你的老师是“李刚”, 或者与你辩驳的是中国人而不是外国人而改变。

使用特权

评论回复
67
123jj| | 2011-3-22 07:48 | 只看该作者
太绕口了,看得头昏脑胀,有点像白马非马
aihe 发表于 2011-3-21 16:42



管他白马非马,还是白猫黑猫,能抓老鼠就是好猫~~~ :lol

使用特权

评论回复
68
abin0415| | 2011-3-22 08:13 | 只看该作者
受益匪浅

使用特权

评论回复
69
maychang| | 2011-3-22 12:47 | 只看该作者
跑题了,应该另发新帖,到同僚版面讨论。

使用特权

评论回复
70
123jj| | 2011-3-22 13:10 | 只看该作者
maychang老师教导的对,是该到同僚版面另开一贴~~~

使用特权

评论回复
71
highgear| | 2011-3-22 20:39 | 只看该作者
我发一个C#做的就餐问题的模拟程序, 用 5 个线程模拟 5 个哲学家。
 

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace Philosopher
{
    class Fork
    {
       const int NOBODY = -1;
       int Owner = NOBODY;
       public Fork() { }

       public bool IsTakenBy(Philosopher p) { return p.ID == Owner; }

       public void TakenBy(Philosopher p)
       {
           if (Owner == NOBODY)
              Owner = p.ID;
       }

       public void PutBy(Philosopher p)
       {
           if (p.ID == Owner)
              Owner = NOBODY;
       }
    }

    class Philosopher
    {
       bool ThreadRunning;
       Thread DinningThread;
       public int ID;
       public Fork Left;
       public Fork Right;

       public Philosopher(int id, Fork left, Fork right)
       {
           ID = id;
           Left = left;
           Right = right;
           DinningThread = new Thread(StartDinning);
           DinningThread.Start();
       }

       public void Think()  { Thread.Sleep(1000); }

       public void Dine()
       {
           lock (this) {
              Left.TakenBy(this);
              Right.TakenBy(this);
           }
           if (Left.IsTakenBy(this) && Right.IsTakenBy(this)) {
              Console.WriteLine("Philosopher " + ID.ToString() + " is dining.");
              Thread.Sleep(1000);
           }
           lock (this) {
              Left.PutBy(this);
              Right.PutBy(this);
           }
       }

       public void Stop() { ThreadRunning = false; }
       void StartDinning()
       {
           ThreadRunning = true;
           while (ThreadRunning) {
              Think();
              Dine();
           }
       }
    }

    class Program
    {
       static void Main(string[] args)
       {
           Fork[] forks = new Fork[] { new Fork(), new Fork(), new Fork(), new Fork(), new Fork() };
           Philosopher[] philosophers = new Philosopher[5];
           for (int i = 0; i < 5; i++) {
              philosophers[i] = new Philosopher(i, forks[i], forks[(i + 4) % 5]);
           }
           Console.Read();
           for (int i = 0; i < 5; i++)
              philosophers[i].Stop();
       }
    }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
123jj + 1
72
123jj| | 2011-3-23 06:52 | 只看该作者
highgear老师程序构思严密,写的很给力,俺学习了~~~

使用特权

评论回复
73
刘前辈| | 2011-3-23 21:00 | 只看该作者
本帖最后由 刘前辈 于 2011-3-23 21:40 编辑

所长写得太棒了,就是不小心打了123jj一个耳光:把5个哲学家分配的太平等了。

class Program

    {

       static void Main(string[] args)

       {

           Fork[] forks = new Fork[] { new Fork(), new Fork(), new Fork(), new Fork(), new Fork() };

           Philosopher[] philosophers = new Philosopher[5];

           for (int i = 0; i < 5; i++) {

              philosophers = new Philosopher(i, forks, forks[(i + 4) % 5]);

           }

           Console.Read();

           for (int i = 0; i < 5; i++)

              philosophers.Stop();

       }

    }

}


123jj 到底看懂了没有?

  123jj
highgear老师程序构思严密,写的很给力,俺学习了~~~


123jj到底想说什么。所长写的5个人都是一样的线程(i%5),还没看出那点“少
量优先级”给了哪一位更聪明的,还是更力气大的哲学家。

说话越说越自我矛盾了。一句话不知反复说了多少遍,不平等,不平等,人类不可能平等,智力、体力不可能平等……动物界也不可能平等……爱因斯坦,坦尼保姆,比尔盖茨……也不知道想说清什么问题,——老刘这说的是机器和机制!没说人类和动物。

        结果所长写了个平等她又“很给力。”你那么热心,到底要干什么?

          哲学家就餐,还有生产者、消费者问题,还有读者、写者问题,还有理发师问题,……都是OS理论的经典问题,您慢慢论证,篡改。没关系:和 XX一起给力:

神马经典问题,都是胡扯。只有咱 XX,“咱从不看书,照样天下第一。”

123 jj  下面又要动用版主的权利,为了天下第一的 XX,删刘前辈此贴了。——太明显了吧。







使用特权

评论回复
74
highgear| | 2011-3-23 21:26 | 只看该作者
楼上刘工你错了。
虽然 5 个线程没有优先级之分,但被投入运行的时间有先后,而且线程在运行过程中会受到诸如鼠标移动等等事件的打断而产生不平等。运行多次可以发现, 最先被投入的 philosopher 0 先吃的次数最多, philosopher 4 先吃的次数最少。
正是这种不平等(少量优先级)让 philosophers 不会发生死锁或活锁。

使用特权

评论回复
75
刘前辈| | 2011-3-23 21:37 | 只看该作者
67楼所长注意自己的言论,别又开始人身攻击。把一个好论题搅和了。

为了你的mm ,也别忘了男人的尊严和论坛的公众性。老以为是你和你的MM两个人的?

使用特权

评论回复
76
highgear| | 2011-3-23 21:43 | 只看该作者
谢谢楼上的提醒和关心。

使用特权

评论回复
77
刘前辈| | 2011-3-23 22:13 | 只看该作者
最先被投入的 philosopher 0 先吃的次数最多, philosopher 4 先吃的次数最少。


75楼所长,我写的程序根本没有这种现象,无论 philosopher 0 还是 philosopher 4!如若像你所说,那这还算什么经典问题,谁都能写了。

    我把我的程序贴上来,根本没有谁吃得多谁经常饥饿的现象。上了8年大学,这点认知还没有?可能吗?那些提出问题的大师都是大忽悠?

         坦尼保姆不会那么逊!

虽然 5 个线程没有优先级之分,但被投入运行的时间有先后,……


哈哈,所长还是不读书,一个并发的5道程序,它的推进是异步的。谁说philosopher 0 先投入运行?我偏偏让 philosopher 4 先投入运行,会怎么样?
    按照所长的程序,谁先投入运行,得到的结果将不一样,——先运行者就吃得多。这叫什么并发程序?裸奔都不一定是这个结果。越往后,5个人越平均。
   
    并发线程虽然异步执行,但是最终结果必然是一样的。否则,就别研究什么操作系统了!

   所以,无论谁先投入运行,5个人必然吃的一样多,如果有人撑死,有人饿死。坦尼保姆跳楼得了。还不如让所长来做OS创始人为好。

    如果我的程序能证明5个人绝对吃的一样多,所长会跳楼吗?——天下第一的牌子早就倒了。技术是发展的。别等着我再给你讲“银行家算法”,老跟在我后面装第一。

好好讨论问题就讨论问题,别动不动就开骂。即使是为了你的……,也绅士一点。

使用特权

评论回复
78
highgear| | 2011-3-23 22:30 | 只看该作者
单核上所谓并行都是伪并行,总会有一个线程会比其他特别一点点,因为不可能做到绝对的平等。5个人吃的一样多也不能证明 5 个人是绝对的平等。刘工你应仔细地看看 64楼 maychang老师的帖子,理解什么是机会平等什么是结果平等。

使用特权

评论回复
79
123jj| | 2011-3-24 04:31 | 只看该作者
highgear老师正解!

虽然 5 个线程没有优先级之分,但被投入运行的时间有先后,而且线程在运行过程中会受到诸如鼠标移动等等事件的打断而产生不平等。运行多次可以发现, 最先被投入的 philosopher 0 先吃的次数最多, philosopher 4 先吃的次数最少。
正是这种不平等(少量优先级)让 philosophers 不会发生死锁或活锁。

这就是本程序的精髓所在,俺学习了,再次感谢highgear老师亲临指点。

使用特权

评论回复
80
123jj| | 2011-3-24 04:37 | 只看该作者
呵呵!目前本贴分两大派。

一派的领头大虾主张写程序,谁能写出程序用代码描述自己的算法—— 谁牛X。(目前改行以理论指点)
另一派的领头大虾主张算法理论,让小菜们能理解且学会基本算法理论—— 授之以渔。(目前改行用代码描述自己的算法)


再次感谢这两位大虾。两位大虾的争论与PK,让俺小菜们大开眼见,长了点本事和记性~~~

使用特权

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

本版积分规则