当前位置:编程学习 > C#/ASP.NET >>

多线程生产者消费者问题

--------------------编程问答-------------------- 原来如此 --------------------编程问答-------------------- 1,根本不一样,对2个属性而已。
2,获得修改。 --------------------编程问答-------------------- 围观,, --------------------编程问答--------------------
引用 2 楼 jason_dct 的回复:
1,根本不一样,对2个属性而已。
2,获得修改。

1,我删掉之后确实是有问题。
lock只是保证在执行那段代码的时候别的线程不能进入,防止f和n的错乱
可是monitor.wait和monitor.PulseAll去掉之后理论上哪里说不过去啊

2,删掉之后没什么反应,是不是就是多余的?
--------------------编程问答--------------------
            lock (this)
            {
                while (f == 5)
                {
                    try
                    {
                        Console.WriteLine(name + "is waiting for apple.");
                        Monitor.Wait(this);
                    }
                    catch (ThreadInterruptedException)
                    { }
                }
                f = f + 1;
                Console.WriteLine(name + "is eating apple");
                Monitor.PulseAll(this);
            }

相当于:
            Monitor.Enter(this);
            try
            {
                while (f == 5)
                {
                    try
                    {
                        Console.WriteLine(name + "is waiting for apple.");
                        Monitor.Wait(this);
                    }
                    catch (ThreadInterruptedException)
                    { }
                }
                f = f + 1;
                Console.WriteLine(name + "is eating apple");
                Monitor.PulseAll(this);
            }
            finally
            {
                Monitor.Exit(this);
            }

标准的Monitor用法
这里的同步纯粹就是为了在 put 和 get 之间同步 f 这个变量
Wait是等待 有空间可以放盘子 或有 盘子可吃
PulseAll 是通知正在 Wait(如果正在Wait的话) 的另一方有 空间可以放盘子 或有 盘子可吃

至于EatAppleSmp,确实没用到,至少是当前没有用到

还有最好是不用Thread.CurrentThread.Abort();
而是 put 返回 false ,线程函数判断并返回,以此正常结束线程

另外就是 get 没有结束的机制
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,