C#同步线程类

来源:互联网 发布:第戎高等商学院 知乎 编辑:程序博客网 时间:2024/06/16 22:54
System.Threading命名空间提供了用于同步线程的类,包括Mutex, Monitor, Interlocked, AutoResetEvent, ManualRestEvent,lock关键字


lock关键字

lock语句通过隐式使用Monitor来提供同步功能,在块开始处调用Monitor.Enter(), 在块结尾处调用Monitor.Exit()
lock关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区,如果其他线程尝试进入锁定的代码,则它将一直等待,直到该对象被释放。
lock(lockObject){     ....}

Monitor
public static void Enter(object) //在指定对象上获取排他锁public static void Exit(object)    //释放指定对象的排他锁
还有一些重载方法

Interlocked
{    if(0 == Interlocked.Exchange(ref usingResource, 1))    {        ....        Interlocked.Exchange(ref usingResource, 0);    }    else    {        ....    } }public static T Exchange(T, T)                      //通过以原子操作的形式将变量设置为指定值public static T CompareExchange(T, T, T) //比较和交换操作按原子操作执行


Mutex:WaitHandle(Mutex继承自WaitHandle)

{    Mutex mutex = new Mutex();    mutex.WaitOne();    .....    mutex.ReleaseMutex();}

WaitOne()请求互斥体的所属权

ReleaseMutex释放互斥体所属权

Mutex是同步基元,它只向一个线程授予对共享资源的独占访问权,如果一个线程获取了互斥体,则要获取该互斥体的第二个线程被挂起,直到第一个线程释放该互斥体。
Mutex类强线程标示,互斥体只能由获得它的线程释放,Semaphore类不强制线程标示
如果线程在拥有互斥体时终止,则称此互斥体被放弃,mutex状态设为收到信号,下一个线程获得所有权,在获取被放弃mutex的下一个线程中将引发AbandonedMutexException

AutoResetEvent
WaitOne()阻止当前线程,直到当前WaitHandle收到信号
Reset    将事件状态设置为非终止状态,导致线程阻止
Set      将事件状态设置为终止状态,允许一个或多个等待线程继续
一旦它被终止,AutoResetEvent将立即释放线程并返回到非终止状态

ManualResetEvent
WaitOne()阻止当前线程,直到当前WaitHandle收到信号
Reset    将事件状态设置为非终止状态,导致线程阻止
Set      将事件状态设置为终止状态,允许一个或多个等待线程继续
一旦它被终止,ManualResetEvent将保持终止状态,直到它被手动重置