예제 #1
0
        static void Main(string[] args)
        {
            //initalize philosophers
            Philosophers philo = new Philosophers();

            //Declare all philosophis as threads
            Thread p0 = new Thread(philo.PhilosophMethod);
            Thread p1 = new Thread(philo.PhilosophMethod);
            Thread p2 = new Thread(philo.PhilosophMethod);
            Thread p3 = new Thread(philo.PhilosophMethod);
            Thread p4 = new Thread(philo.PhilosophMethod);

            p0.Start(0);
            p1.Start(1);
            p2.Start(2);
            p3.Start(3);
            p4.Start(4);

            Console.ReadLine();
        }
예제 #2
0
        public void NextState(Philosophers p)
        {
            Thread.Sleep(1000);

            //随机到的数字小于0.5
            if (_next.NextDouble() < 0.5)
            {
                lock (Locker)
                {
                    //放下叉子,如果之前的状态是吃饭
                    //如果之前的状态也是思考,就不需要放下叉子
                    if (p.CurrentState == State.Eat)
                    {
                        _folks[p.Index] = 0;
                        if (p.Index != 4)
                        {
                            _folks[p.Index + 1] = 0;
                        }
                        else
                        {
                            _folks[0] = 0;
                        }
                    }

                    //开始思考
                    p.CurrentState = State.Think;

                    Console.WriteLine("{0}开始思考。当前叉子状态: {1}", p.Name, string.Join(",", _folks));
                }
            }
            else
            {
                //正在吃就接着吃
                if (p.CurrentState == State.Eat || NumOfFood == 0)
                {
                    return;
                }

                //尝试开吃
                lock (Locker)
                {
                    //左边的叉子
                    var folkLeft = p.Index;

                    //右边的叉子
                    var folkRight = p.Index == 4 ? 0 : p.Index + 1;

                    //只有左右两边的叉子都没人用才可以开吃
                    if (_folks[folkLeft] == 0 && _folks[folkRight] == 0)
                    {
                        p.CurrentState = State.Eat;

                        _folks[folkLeft]  = 1;
                        _folks[folkRight] = 1;

                        NumOfFood--;
                        Console.WriteLine("{0}开始吃饭,并拿起叉子{1}和{2}。食物总量: {3}, 当前叉子状态: {4}", p.Name, folkLeft, folkRight,
                                          NumOfFood, string.Join(",", _folks));
                    }
                    else
                    {
                        Console.WriteLine("{0}无法开始吃饭,因为他需要拿起叉子{1}和{2}。当前叉子状态: {3}", p.Name, folkLeft, folkRight,
                                          string.Join(",", _folks));
                    }
                }
            }
        }