添加:好的,所以我可以分离互斥量和信号量,我只是想知道我的反击的想法是对的吗? 即Release减1和WaitOne加一,只有当计数器大于零时,才允许运行。 这句话对吗?
我有一些效果很好的代码:按顺序运行first()second()third()。
我只是想知道信号量中的计数器是如何工作的?我知道这是反制的。该版本减去1并且WaitOne添加一个,只有当计数器大于零时,它才会允许运行。正确?
但是我读了另一件关于Mutex的书,这本书说Mutex Waitone减1,并且释放添加一个,所以互斥量与信号量相反?对?
代码:
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);
}
}
}
答案 0 :(得分:5)
互斥体基本上是信号量的特例。它可以被认为(即使它实际上不会被实现为)从一个开始但不能大于一个的信号量。
想象一个Semaphore
作为整数的包装器和mutex
作为布尔值的包装器。它只有两个状态,空闲或锁定。
答案 1 :(得分:1)
Mutex就像拥有只有一个允许线程的信号量一样。
Mutex只允许一次访问资源,而信号量可以设置为允许任何预设数量的资源或一段代码的并发访问。
编辑:
如果命名它们,则可以在不同的进程中使用它们。