【发布时间】: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