互斥锁与信号量有什么关系?
本文关键字:什么 关系 信号量 | 更新日期: 2023-09-27 17:51:04
添加:好的,所以我可以把互斥锁和信号量分开,我只是想知道这是我的计数器的想法对吗?即Release - 1和WaitOne加1,只有当计数器大于0时,才允许运行。这个说法对吗?
我有一些运行良好的代码:按顺序运行first() second() third()
我只是想知道计数器在信号量是如何工作的?我知道它是反的。Release - 1和WaitOne加1,只有当计数器大于0时,才会允许运行。对吧?
然而,我读了一本关于另一件事的书,互斥锁,书上说互斥锁等待减一,释放加一,所以互斥锁是相反的信号量?对吧?
代码: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
是一个布尔值的包装器。它只有两种状态:空闲或锁定。
互斥锁就像一个只允许一个线程的信号量。
互斥锁只允许一次访问一个资源,而信号量可以设置为允许对资源或一段代码的任意预设数量的并发访问。
编辑: