Mutex如何与信号量相关?

San*_*hao 4 c# multithreading mutex semaphore

添加:好的,所以我可以分隔互斥量和信号量,我只是想知道我的反击的想法是对的吗?即Release减1和WaitOne加一,只有当计数器大于零时,才允许运行.这句话对吗?

我有一些运行良好的代码:按顺序运行first()second()third().

我只想知道信号量中的计数器是如何工作的?我知道这是反制的.该版本减去1并且WaitOne添加一个,只有当计数器大于零时,它才会允许运行.对?

但是我读了另一件关于Mutex的书,这本书说Mutex Waitone减1,并且发布添加一个,所以mutex与信号量相反?对?

码:

using System;

namespace Algorithm.MultiThread
{
    class Semaphore
    {
        System.Threading.Semaphore s1, s2;
        public Semaphore()
        {
            s1 = new System.Threading.Semaphore(1, 5);
            s2 = new System.Threading.Semaphore(1, 5); //initialize as start counter 1
        }

        public void first()
        {
            Console.WriteLine("First");
            s1.Release(); // minus one
        }

        public void second()
        {
            s1.WaitOne(); //add one two times
            s1.WaitOne();
            Console.WriteLine("Second");
            s2.Release();
        }

        public void third()
        {
            s2.WaitOne(); // add one two times
            s2.WaitOne();
            Console.WriteLine("Third");

        }

        public void startnum(object obj)
        {
            int i = (int)obj;
            switch (i)
            {
                case 1:
                    first();
                    break;
                case 2:
                    second();
                    break;
                case 3:
                    third();
                    break;
                default:
                    break;
            }
        }

        public static void test()
        {
            Semaphore s = new Semaphore();
            System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
            System.Threading.Thread t2 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
            System.Threading.Thread t3 = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(s.startnum));
            t1.Start(3);
            t2.Start(2);
            t3.Start(1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

互斥体基本上是信号量的特例.它可以被认为(即使它实际上不会被实现为)从一个开始并且不能大于一个的信号量.

想象一个Semaphore围绕整数mutex的包装器和围绕布尔值的包装器.它只有两种状态,自由或锁定.

  • 嗯,还有更多的东西 - 请参阅@Hans评论. (2认同)