多线程同步

C#中线程同步常用方法
1.Mutex类(互斥器),Monitor类,lock方法
2.ManualResetEvent类,AutoResetEvent类(这两个都是由EventWaitHandle类派生出来的)
3.ReaderWriterLock类

  1. 维护自由锁(InterLocked)实现同步

  2. 监视器(Monitor)和互斥锁(lock)

  3. 读写锁(ReadWriteLock)

  4. 系统内核对象

  1. 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)

  2. 线程池
    Thread.Join
    比如你的程序需要在后台处理一大堆数据,但还要使用户界面处于可操作状态
    volatile
    并不能实现真正的同步,因为它的操作级别只停留在变量级别,而不是原子级别。如果是在单处理器系统中,是没有任何问题的,变量在主存中没有机会被其他人修改

public class A
{
private volatile int _i;
public int I
{
get { return _i; }
set { _i = value; }
}
}

lock关键字
lock是一种比较好用的简单的线程同步方式,它是通过为给定对象获取互斥锁来实现同步的。它可以保证当一个线程在关键代码段的时候,另一个线程不会进来,它只能等待,等到那个线程对象被释放,也就是说线程出了临界区

public void Function() 
{
object lockThis = new object (); 
lock (lockThis)
{
// Access thread-sensitive resources. 
}
}

总的来说,lock语句是一种有效的、不跨越多个方法的小代码块同步的做法,也就是使用lock语句只能在某个方法的部分代码之间,不能跨越方法。
Monitor类
lock就是用Monitor类实现的,除了锁定代码区,我们还可用Monitor类的Wait()和 pulse()方法。
Wait()方法是临时释放当前活得的锁,并使当前对象处于阻塞状态
Pulse()方法是通知处于等待状态的对象可以准备就绪了,它一会就会释放锁

Monitor.Enter(objLock);
try  
{  
    DoSomething();  
}  
finally  
{  
  Monitor.Exit(objLock);  
}  

Mutex(系统内核对象)
mutex 与监视器相似;它防止多个线程在某一时间同时执行某个代码块。 事实上,名称“mutex”是术语“互相排斥 (mutually exclusive)”的缩写形式。 但是,与监视器不同,mutex 可用于进程间的同步线程。 mutex 由 Mutex 类表示,1.打开或者创建一个Mutex实例;2.调用WaitOne()来请求互斥对象;3.最后调用ReleaseMutex来释放互斥对象,WaitOne和ReleaseMutex必须成对出现,否则会导致进程死锁的发生,这时系统(.Net2.0)框架会抛出AbandonedMutexException异常

 private static Mutex mut = new Mutex();
 mut.WaitOne
  mut.ReleaseMutex();
  

ReadWriteLock
读写锁的出现主要是在很多情况下,我们读资源的操作要多于写资源的操作。但是如果每 次只对资源赋予一个线程的访问权限显然是低效的,读写锁的优势是同时可以有多个线程对同一资源进行读操作。因此在读操作比写操作多很多,并且写操作的时间 很短的情况下使用读写锁是比较有效率的。读写锁是一个非静态类所以你在使用前需要先声明一个读写锁对象:
static private ReaderWriterLock _rwlock = new ReaderWriterLock();

读写锁是通过调用AcquireReaderLock,ReleaseReaderLock,AcquireWriterLock,ReleaseWriterLock来完成读锁和写锁控制的
Semaphore
信号量的行为有点类似于Mutex或是lock,但是信号量没有拥有者。任意线程都可以调用Release来释放信号量而不像Mutex和lock那样需要线程得到资源才能释放
static Semaphore s = new Semaphore(3, 3); // 当前值=3; 容量=3
s.WaitOne();
s.Release();

Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值