"对象同步方法是从一个不同步的代码块调用的。使用监视器和锁

时间:2018-03-18 08:06:51

标签: c# multithreading locking monitor producer-consumer

我已经在现有帖子中搜索了这个错误,但我没有解决我在那里发现的问题。

我使用锁和2个监视器对象来实现消费者 - 生产者问题。但是当我运行代码时,得到以下错误'对象同步方法是从一个不同步的代码块中调用的。'。 我已经发现了我的代码:

ProducerConsumer.cs:

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

namespace ProducerConsumer
{
    public class ProducerConsumer
    {
        private Queue<int> _items;
        private object _lockObject;
        private object _condProd;
        private object _condCons;

        public ProducerConsumer()
        {
            _items = new Queue<int>();
            _lockObject = new object();
            _condProd = new object();
            _condCons = new object();
        }

        public void Produce(string name)
        {
            int count = 1;
            bool produced = false;

            while (true)
            {     
                if (produced == false)
                {
                    Console.WriteLine(name + "/Produced: " + count);
                    Thread.Sleep(50);
                    produced = true;
                    count++;
                }

                lock (_lockObject)
                {
                    while (_items.Count == 5)
                    {
                        Monitor.Wait(_condProd);
                    }

                    _items.Enqueue(count);
                }
                Monitor.Pulse(_condCons);

                produced = false;

            }
        }

        public void Consume(string name)
        {
            int count = 0;
            while (true)
            {
                lock (_lockObject)
                {
                    while (_items.Count == 0)
                    {
                        Monitor.Wait(_condCons);
                    }

                    count = _items.Dequeue();
                    Console.WriteLine(name + "/Scos din lista: " + count);
                }

                Monitor.Pulse(_condProd);
            }
        }
    }
}

Program.cs:

using System;
using System.Threading.Tasks;

namespace ProducerConsumer
{
    class Program
    {
        static void Main(string[] args)
        {
            ProducerConsumer pc = new ProducerConsumer();
            Task p = Task.Factory.StartNew(() => pc.Produce("Producer 1"));
            Task c = Task.Factory.StartNew(() => pc.Consume("Consumer 1"));
            Task.WaitAll(p, c);
            Console.ReadKey();
        }
    }
}

请帮助我理解为什么我会收到此错误以及如何解决它,我是C#语言的线程部分的新手。提前谢谢。

1 个答案:

答案 0 :(得分:0)

要致电Monitor.Pulse(_condCons);,您需要锁定_condCons;要致电Monitor.Wait(_condProd);,您需要锁定_condProd。目前尚不清楚 wait 是否锁定正确的对象,并且脉冲似乎没有锁定任何对象。