Mutex和Semaphore有什么关系?

4

添加:好的,那么我可以分离互斥锁和信号量,我只想知道我的计数器的想法是否正确?即释放减一,等待加一,仅当计数器大于零时,它才允许运行。这个说法对吗?

我有一些代码可以按顺序运行first() second() third()。

我只想知道信号量中的计数器是如何工作的?我知道它是一个计数器。释放减一,等待加一,仅当计数器大于零时,它才会允许运行。对吗?

然而,我读了关于另一件事的书,互斥锁,书上说互斥锁Waitone减一,释放加一,所以互斥锁与信号量相反?对吗?

代码:

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);
        }
    }
}

2
互斥锁是信号量的一种特殊情况(计数=1)。 - Matt Ball
4
互斥锁(mutex)和信号量(semaphore)的工作方式非常不同,它们不能相互比较。互斥锁由线程拥有并且可以被拥有者线程重入。信号量没有线程关联性。 - Hans Passant
@HansPassant +1 ,但是,从程序员的角度来看,计数为1的信号量就像互斥锁一样,对吧? - sharp12345
2
不,你不能从程序员的角度来比较它们。同步对象最常见的用途是保护共享状态,确保只有一个线程可以同时访问它。这可以通过互斥锁来正确处理。在此类使用中,信号量容易导致死锁,因为它不可重入。 - Hans Passant
2个回答

5

互斥锁基本上是信号量的一个特例。可以这样想(即使它实际上不会被实现为):信号量从1开始,永远不能大于1。

Semaphore想象成一个整数的包装器,而mutex则是一个布尔值的包装器。它只有两种状态,自由或锁定。


2
嗯,这不仅仅是那样的 - 请参考@Hans的评论。 - Martin James
-1 马丁·詹姆斯所说的加上本地信号量仅存在于您的进程中。 - tymtam

1

Mutex(互斥锁)就像只允许一个线程的 Semaphore(信号量)。

Mutex 只允许同时有一个进程访问资源,而 Semaphore 可以设置允许并发访问资源或代码块的预设数量。

编辑:

如果命名,两者都可以用于不同的进程中。


-1 这可能是在非技术论坛上的一个很好的解释。有重要的区别。 - tymtam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接