【问题标题】:Implement Semaphore using Monitor.Wait(obj) and Monitor.Pulse(obj)使用 Monitor.Wait(obj) 和 Monitor.Pulse(obj) 实现信号量
【发布时间】:2021-12-10 09:04:24
【问题描述】:

我有以下任务:

“普通”信号量

初始化为可用资源的数量。

操作:

request () - waits until the resource is released,
release () - releases the resource,
numberAvailable () - returns number available resources, the n  

我尝试使用Semaphore slim 来实现:

    class Program
    {
        private const int InitialCount = 2;
        private const int MaximumCount = 8;

        static void Main()
        {
            var semaphoreObject = new SemaphoreSlim(InitialCount, MaximumCount);
            var printerObject = new Printer();

            for (int i = 0; i < 20; ++i)
            {
                int j = i;
                Task.Factory.StartNew(() =>
                {
                    Request(semaphoreObject);
                    printerObject.Print(j);
                    Release(semaphoreObject);
                    NumberAvailable(semaphoreObject);
                });
            }
            Console.ReadLine();
        }

        private static void Request(SemaphoreSlim s)
        {
            s.Wait();
        }

        private static void Release(SemaphoreSlim s)
        {
            s.Release();
        }

        private static void NumberAvailable(SemaphoreSlim s)
        {
            Console.WriteLine($"Available resource: {s.CurrentCount}");
        }
    }

    class Printer
    {
        public void Print(int documentToPrint)
        {
            Console.WriteLine("Printing document: " + documentToPrint);
            Thread.Sleep(TimeSpan.FromSeconds(5));
        }
    }

但是现在,我需要使用 Monitor 类来做到这一点,所以我应该创建自己的信号量类。但是我对如何改变它有点迷茫

【问题讨论】:

    标签: c# semaphore monitor


    【解决方案1】:

    我不会为你编写代码,但我会这样做

    1. 在新的信号量类中,创建一个计数器。
    2. 在请求方法中使用监视器来:
      1. 增加计数
    3. 如果计数与允许的线程数相同,请使用另一个监视器锁定新对象
    4. 发布时
      1. 减少第一个监视器内的计数
      2. 如果第二台显示器被锁定,则解锁它。

    请记住,这不是最好的方法。对生产代码使用内部类型。这只是为了让您开始进行练习等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多