在.Net框架中C#实现多线程的同步方法详解 本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net 框架中,实现线程同步主要通过以下的几种方式来实现,在MSDN 的线程指南中已经讲了几种,本文结合作者实际中用到的方式一起说明一下。 1. 维护自由锁(InterLocked)实现同步 2. 监视器(Monitor)和互斥锁(lock) 3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent) 2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用 Thread.Join 方法。这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。 自由锁(InterLocked) 对一个 32 位的整型数进行递增和递减操作来实现锁,有人会问为什么不用++或--来操作。因为在多线程中对锁进行操作必须是原子的,而++和--不具备这个能力。InterLocked 类还提供了两个另外的函数 Exchange, CompareExchange 用于实现交换和比较交换。Exchange 操作会将新值设置到变量中并返回变量的原来值: int oVal = InterLocked.Exchange(ref val, 1)。 监视器(Monitor) 在MSDN 中对 Monitor 的描述是: Monitor 类通过向单个线程授予对象锁来控制对对象的访问。 Monitor 类是一个静态类因此你不能通过实例化来得到类的对象。Monitor 的成员可以查看 MSDN,基本上 Monitor 的效果和 lock 是一样的,通过加锁操作 Enter 设置临界区,完成操作后使用 Exit 操作来释放对象锁。不过相对来说 Monitor 的功能更强,Moniter 可以进行测试锁的状态,因此你可以控制对临界区的访问选择,等待 or 离开, 而且 Monitor还可以在释放锁之前通知指定的对象,更重要的是使用 Monitor 可以跨越方法来操作。Monitor提供的方法很少就只有获取锁的方法Enter, TryEnter;释放锁的方法Wait, Exit;还有消息通知方法Pulse, PulseAll。经典的Monitor 操作是这样的: // 通监视器来创建临界区 static public void DelUser(string name) { try { // 等待线程进入 Monitor.Enter(Names); Names.Remove(name); Console.WriteLine("Del: {0}", Names.Count); Monitor.Pulse(Names); } finally { // 释放对象锁 Monitor.Exit(Names);...