码迷,mamicode.com
首页 > 编程语言 > 详细

C#线程同步

时间:2015-07-30 09:40:00      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

微软官网: https://msdn.microsoft.com/zh-cn/library/ms173179.aspx

官网上提到下面几种:

lock 

private System.Object lockThis = new System.Object();
lock (lockThis)
{
    //需要保护的地方
}

VB版是SyncLock

Monitor

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);try{
    DoSomething();
}finally{
    System.Threading.Monitor.Exit(obj);
}

使用 lock 通常比直接使用 Monitor 类更可取,一方面是因为 lock 更简洁,另一方面是因为 lock确保了即使受保护的代码引发异常,也可以释放基础监视器。

Event

与Windows类似,有 AutoResetEvent和ManualResetEvent,如果为自动置位,则对该事件调用WaitForSingleObject()后会自动调用ResetEvent()使事件变成未触发状态。WaitOne,WaitAny和WaitAll则类似WaitForSingleObject/WaitForMultiObject。从字面意义可以看出One表示1个,Any表示1个或多个,All表示所有。

WaitOne causes the thread to wait until a single event becomes signaled, WaitHandle.WaitAny blocks a thread until one or more indicated events become signaled, and WaitHandle.WaitAll blocks the thread until all of the indicated events become signaled. An event becomes signaled when its Set method is called.

Mutex

尽管 mutex 可以用于进程内的线程同步,但是使用 Monitor 通常更为可取,因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源。 相比之下,Mutex 类是 Win32 构造的包装。 尽管 mutex 比监视器更为强大,但是相对于 Monitor 类,它所需要的互操作转换更消耗计算资源(Mutex可以跨进程,Monitor不行)。

Interlocked

类似MFC的原子操作(InterlockedIncrement...),使用这个类的方法可以安全地递增、递减、交换和比较任何线程中的值。

ReaderWriterLock 

读写锁,通过调用:AcquireReaderLock,ReleaseReaderLock,AcquireWriterLock,ReleaseWriterLock来完成读锁和写锁控制的

Win32其他内核对象

如信号量,可以用来实现生产者/消费者模式

SynchronizationAttribute

当我们确定某个类的实例在同一时刻只能被一个线程访问时,我们可以直接将类标识成Synchronization的,这样,CLR会自动对这个类实施同步机制,实际上,这里面涉及到同步域的概念,当类按如下设计时,我们可以确保类的实例无法被多个线程同时访问

 1) 在类的声明中,添加System.Runtime.Remoting.Contexts.SynchronizationAttribute属性。

   2).继承至System.ContextBoundObject,必须

MethodImplAttribute

如果临界区是跨越整个方法的,也就是说,整个方法内部的代码都需要上锁的话,使用MethodImplAttribute属性会更简单一些。这样就不用在方法内部加锁了,只需要在方法上面加上 [MethodImpl(MethodImplOptions.Synchronized)] 就可以了。


C#线程同步

标签:

原文地址:http://my.oschina.net/shanlilaideyu/blog/485363

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!