semaphore.CurrentCount如何在此上下文中工作?

时间:2016-12-17 02:49:37

标签: c# multithreading semaphore

我刚刚开始学习SemaphoreSlim但是semaphore.CurrentCount在这个程序中如何递增和递减?根据我的理解,当调用semaphore.Wait()时,释放计数器减1,当semaphore.Release()时,允许两个线程执行,但semaphore.CurrentCount如何增加?它是从0还是1开始?

        var semaphore = new SemaphoreSlim(2, 10);
        for (int i = 0; i < 20; i++)
        {
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Entering task " + Task.CurrentId);
                semaphore.Wait(); //releasecount--
                Console.WriteLine("Processing task " + Task.CurrentId);
            });
        }

        while (semaphore.CurrentCount <= 2)
        {
            Console.WriteLine("Semaphore count: " + semaphore.CurrentCount);
            Console.ReadKey();
            semaphore.Release(2);
        }
        Console.ReadKey();

2 个答案:

答案 0 :(得分:1)

信号量就像一个具有一定容量的房间。使用SemaphoreSlim,您可以指定初始容量和最大容量。达到最大值后,没有人可以进入房间。每离开房间的物品,只允许一个人进入。

CurrentCount获取可以进入房间的剩余线程数。

    for (int i = 0; i < 20; i++)
    {
        Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Entering task " + Task.CurrentId);
            semaphore.Wait(); //only from 2 - 10 threads can be at the time
            Console.WriteLine("Processing task " + Task.CurrentId);
        });
    }

在这里

while (semaphore.CurrentCount <= 2) 

如果在那一刻剩余线程的数量小于2,那么你在房间里释放两个空格

答案 1 :(得分:0)

Wait递减它,Release递增它。