C# 中信号量的使用
.NET Framework 中信号量的定义在 System.Threading 中,名为 Semaphore 的类。
在操作系统的课程我们应该学到了如果使用信号量来进行多线程或者多进程的同步和互斥。(如果你没学过,不妨找一本书看看。个人认为很有好处。^_^)这时,你就可以用 Semaphore 进行一个小练习了。
我们可以随便使用 Semaphore 来做个 Demo。反正是给你自己看的,不用太好啦。
private Semaphore sem = new Semaphore(0, 1);
public void Begin()
{
Thread.Sleep(1000);
Console.WriteLine("Begin()");
sem.Release();
}
public void End()
{
sem.WaitOne();
}
public static void Main
{
Thread t = new Thread(Begin);
t.Start();
// Do some work here.
Console.WriteLine("Main()");
End();
}
怎么样,简单吧。跟操作系统中所说的信号量没什么两样。当然可以把信号量中的计数器给改一下。方法是在构造函数中指定不同的数值就可以了。
异步调用有了它让人感觉到十分的有把握了。至少我现在是不再怕多线程的程序了。
与 Semaphore 类似的有一个 ManualResetEvent 和 AutoResetEvent。它们相当于 new Semaphore(0, 1)。我个人感觉是这样的。但是我也没把 ManualResetEvent 和 AutoResetEvent 之间的关系搞清楚。所以建议看此文的人去查一下 MSDN。
以下是.NET提供的线程处理对象:
Monitor
解释如何使用 Monitor 类来同步对成员的访问或生成自己的线程管理类型。
WaitHandle
描述 WaitHandle 对象,该对象是操作系统同步句柄的托管表示形式。
ManualResetEvent
解释在事件发生时如何向 ManualResetEvent 发出信号以及如何手动重置它。
AutoResetEvent
解释在事件发生时如何向 AutoResetEvent 发出信号。
Mutex
解释如何使用 Mutex 来同步对对象的访问或生成自己的同步机制。
Interlocked
解释如何使用 Interlocked 类来递增或递减值以及在单个原子操作中存储该值。
ReaderWriterLock
定义实现单个编写器/多个读取器语义的锁。