【问题标题】:How does as Mutex relate to a Semaphore?互斥量与信号量有何关系?
【发布时间】:2013-01-07 19:17:36
【问题描述】:

添加:好的,所以我可以将互斥锁和信号量分开,我只想知道我的计数器想法对吗? 即Release减一和WaitOne加一,只有当计数器大于零时才允许运行。 这个说法对吗?

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

我只想知道信号量中的计数器是如何工作的?我知道它是计数器。就是说Release减一,WaitOne加一,只有计数器大于零才允许运行。对吧?

但是我读了关于另一件事的书,互斥量,书上说互斥量 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);
        }
    }
}

【问题讨论】:

  • 互斥锁是信号量的特例(count = 1)。
  • 互斥量与信号量的工作方式非常不同,您无法比较它们。互斥锁由线程拥有,并由所有者线程重入。信号量没有任何线程亲和性。
  • @HansPassant +1 ,但是,当从编码人员的角度谈论它们的功能时,count=1 的信号量就像一个互斥体,不是吗?
  • 不,您无法从编码人员的角度比较它们。到目前为止,同步对象最常见的用途是保护共享状态,确保只有一个线程可以同时访问它。由互斥锁正确寻址。信号量在这种使用中容易造成死锁,它是不可重入的。

标签: c# multithreading mutex semaphore


【解决方案1】:

互斥体基本上是信号量的一种特殊情况。它可以被认为是(即使它实际上不会被实现为)一个从 1 开始并且永远不能大于 1 的信号量。

Semaphore 想象为整数的包装器,将mutex 想象为布尔值的包装器。它只有两种状态,空闲或锁定。

【讨论】:

  • 嗯,还有更多内容 - 请参阅@Hans 评论。
  • -1 Martin James 所说的以及本地信号量仅存在于您的进程中。
【解决方案2】:

Mutex 就像一个信号量只有一个允许的线程。

Mutex 只允许一次访问一个资源,而信号量可以设置为允许任意预设数量的并发访问一个资源或一段代码。

编辑:

如果它们被命名,两者都可以在不同的进程中使用。

【讨论】:

  • -1 这在非技术论坛上可能是一个很好的解释。有重要的区别。
猜你喜欢
  • 2017-08-24
  • 2012-09-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多