C# C语言中信号量中的Release和WaitOne#

C# C语言中信号量中的Release和WaitOne#,c#,semaphore,waitone,C#,Semaphore,Waitone,我正在用C#处理信号量。以下是我对C#中的Release和WaitOne方法的理解 WaitOne方法在线程进入插槽时减少信号量计数,当线程离开插槽时,信号量增加 Release方法返回上一个信号量计数,对吗?我的理解与以下代码相矛盾: static Thread[] threads = new Thread[5]; static Semaphore sem = new Semaphore(3,5); static void SemaphoreTest()

我正在用C#处理信号量。以下是我对C#中的
Release
WaitOne
方法的理解

WaitOne
方法在线程进入插槽时减少信号量计数,当线程离开插槽时,信号量增加

Release
方法返回上一个信号量计数,对吗?我的理解与以下代码相矛盾:

  static Thread[] threads = new Thread[5];
        static Semaphore sem = new Semaphore(3,5);
        static void SemaphoreTest()
        {
            Console.WriteLine("{0} is waiting in line...", Thread.CurrentThread.Name);
            Console.WriteLine("Semaphore count : "+sem.WaitOne());
            Console.WriteLine("{0} enters the semaphore test", Thread.CurrentThread.Name);
            Thread.Sleep(300);

            Console.WriteLine("{0} is leaving the semaphore test and the semaphore count is {1}", Thread.CurrentThread.Name, sem.Release());

        }
        static void Main(string[] args)![enter image description here][2]
        {
            for (int i = 0; i < 5; i++)
            {
                threads[i] = new Thread(SemaphoreTest);
                threads[i].Name = "thread_" + i;
                threads[i].Start();

            }
            Console.Read();
静态线程[]线程=新线程[5];
静态信号量sem=新信号量(3,5);
静态void信号量测试()
{
WriteLine(“{0}正在排队等待…”,Thread.CurrentThread.Name);
WriteLine(“信号量计数:+sem.WaitOne());
WriteLine(“{0}进入信号量测试”,Thread.CurrentThread.Name);
睡眠(300);
WriteLine(“{0}正在离开信号量测试,信号量计数为{1}”,Thread.CurrentThread.Name,sem.Release());
}
静态void Main(字符串[]参数)![在此处输入图像描述][2]
{
对于(int i=0;i<5;i++)
{
线程[i]=新线程(信号量测试);
线程[i].Name=“thread\uu”+i;
线程[i].Start();
}
Console.Read();

Thread_2离开,因此信号量计数必须增加。但这并没有发生,因为当Thread_0即将离开时,上一个信号量计数为0。据我所知,它必须为1。我说得对吗?有人能解释一下吗?

文档描述了
Releas的返回值e()
方法如下:

调用Release方法之前信号量的计数

请注意,这不同于说该方法返回信号量刚刚释放前的值

特别是,如果有两个线程竞相释放信号量,它们都可以调用
release()
有效地同时执行,导致两个线程的该值相同。也就是说,调用该方法与实际释放信号量并不完全相同;该方法必须在实际释放信号量之前做一些工作,并且信号量的计数保持不变,直到实际发生为止

我还要指出:至少在我运行测试时,我看到线程#3在线程#0报告离开之前获取信号量。现在,我们不确定这些操作实际发生的顺序(控制台输出的顺序可能与线程与信号量交互的顺序完全相同,也可能不完全相同),但另一种可能性是线程3在线程2释放信号量之后,但在线程0释放信号量之前获取信号量


在许多有效的场景中,您会看到连续返回的计数为0。

0是完全正常的,一个可能的意外是线程0、1和2进入了信号量。看到1也是正常的。您正在做一个非常危险的假设,无法保证线程将在0中获取信号量订单。