当前位置:编程学习 > C#/ASP.NET >>

C#中线程类的使用经验

一.Mutex类

MSDN简单描述:

  当两个或更多线程需要同时访问一个共享资源时,系 统需要使用同步机制来确保 一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥 体。

可以使用 WaitHandle.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用 ReleaseMutex 方法同样多的次数以释放互斥体的所属权。Mutex 类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore 类不强制线程标识。

  互斥体有两种类型:局部互斥体和已命名的系统互斥体。如果使用接受名称的构 造函数创建 Mutex 对象,则该对象与具有该名称的操作系统对象关联。已命名的系统互斥体在整个操作系统中都可见,可用于同步进程活动。您可以创建多个 Mutex 对象来表示同一个已命名的系统互斥体,也可以使用 OpenExisting 方法打开现有的已命名系统互斥 体。

  局部互斥体仅存在于您的 进程内。您的进程中任何引用局部 Mutex 对象的线程都可以使用它。每个 Mutex 对象都是一个单独的局部互斥体。

个人对互斥对象(Mutex)的理解:

  1. 做不到两个线程交互执行的目的。如果把Mutex对象放在了两个线程的循环里,当线程执行出了临界区,两个线程都会马上去抢互斥对象,所以可能一个线程的循环里可能会多次执行!

例:

    For(int i=0;i<count;i++)

{

   Mutex.WaitOne();

       ……….

   Mutex.releaseMutex();

}在一个线程中这个循环可能执行多次

2.它的一个最大的用处就是上面我标黄的文字所述,可以防止一个程序创建多个进程。

二、Monitor类(或Lock锁)

MSDN简单描述:

       Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取 该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。

       Monitor 具有以下功能:

  • 它根据需要与某个对象相关联。
  • 它 是未绑定的,也就是说可以直接从任何上下文调用它。
  • 不能创建 Monitor 类的实例。

将为每个同步对象来维护以下信息:

  • 对当前持有锁的线程的引用。
  • 对 就绪队列的引用,它包含准备获取锁的线程。
  • 对等待队列的引用,它包含正在等待锁定对象状态变化通知的线程。

下表描述了访问同步对象的线程可以采取的操作:

操作

说明

Enter, TryEnter

获 取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。

Wait

释 放对象上的锁以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。

Pulse (信号), PulseAll

向 一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。等待线程被放置在对象的就绪队列中以便它可以最后接 收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。

Exit

释 放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。

使用 Enter 和 Exit 方法标记临界区的开头和结尾。如果临界区是一个连续指令集,则由 Enter 方法获取的锁将保证只有一个线程可以使用锁定对象执行所包含的代码。

个人对Monitor类的理解:

    1.实看MSDN的描述似乎Monitor类和Mutex类的功能差不多,都是锁定临界区来到达多线程同步,其实,如果只用Monitor类的Enter和Exit方法的话也会出现用Mutex类锁定临界区的情况,即在出了临界区,每个线程(包括刚释放锁的线程)都会去抢这个锁。但是因为有了Monitor类的Wait方法和Pluse方法才可以让两个线程到达互斥访问临界区的目的,即每个线程访问交互的访问自己的线程上下文(这样说好些?说自己的代码区是否也可以?),但是这两个方法必须放在用Lock或Monitor(用Enter和Exit方法)锁定的临界区内!

   

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,