c# - Mutex 与信号量有什么关系?

标签 c# multithreading mutex semaphore

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

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

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

但是我读了另一本书,Mutex,书上说 Mutex Waitone 减一,release 加一,所以 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);
        }
    }
}

最佳答案

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

Semaphore 想象成一个整数的包装器,将一个 mutex 想象成一个 bool 值的包装器。它只有两种状态,空闲或锁定。

关于c# - Mutex 与信号量有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14202554/

相关文章:

java - java中Web应用程序的后台进程

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

c++ - DLL 和应用程序之间的互斥锁共享

c - Windows互斥体的gcc编译错误

c# - 有什么方法可以显示特定的自定义重载运算符的作用吗?

java - Sockets 和 ServerSockets 服务器/客户端 GUI 聊天程序

java - Collections.sort 方法有时会在多线程环境中抛出 ConcurrentModificationException。列表未在结构上进行修改

c# - 像在亚洲一样测试 iOS 应用程序

我的基类中的 c# SqlDatareader 返回空连接错误

c# - 如何将多个项目存储在一个 XML 文件中以便于解析?