C# 中信号量的使用

it2022-05-09  34

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       定义实现单个编写器/多个读取器语义的锁。

转载于:https://www.cnblogs.com/pancult/archive/2009/02/04/1383586.html

相关资源:深入了解c# 信号量和互斥体

最新回复(0)