当前位置:首页>网络学院>程序开发>c#教程>文章内容

c#线程同步中的lock,monitor,同步事件和等待句柄以及mutex的介绍

[ 来源:http://www.it55.com | 作者: | 时间:2007-12-13 | 收藏 | 推荐 ] 【


   {
   double preCalc = randomGenerator.NextDouble();
   manualEvent.WaitOne();
   thirdTerm = preCalc * baseNumber *
   randomGenerator.NextDouble();
   autoEvents[2].Set();
   }
   public double Result(int seed)
   {
   randomGenerator = new Random(seed);
  
   // Simultaneously calculate the terms.
   ThreadPool.QueueUserWorkItem(
   new WaitCallback(CalculateBase));
   ThreadPool.QueueUserWorkItem(
   new WaitCallback(CalculateFirstTerm));
   ThreadPool.QueueUserWorkItem(
   new WaitCallback(CalculateSecondTerm));
   ThreadPool.QueueUserWorkItem(
   new WaitCallback(CalculateThirdTerm));
   // Wait for all of the terms to be calculated.
   WaitHandle.WaitAll(autoEvents);
   // Reset the wait handle for the next calculation.
   manualEvent.Reset();
   return firstTerm + secondTerm + thirdTerm;
   }
  }
   该示例一共有4个ResetEvent,一个ManualEvent,三个AutoResetEvent,分别反映4个线程的运行状态。ManualEvent和AutoResetEvent有一点不同:AutoResetEvent是在当前线程调用set方法激活某线程之后,AutoResetEvent状态自动重置,而ManualEvent则需要手动调用Reset方法来重置状态。接着来看看上面那段代码的执行顺序,Main方法首先调用的是Result 方法,Result方法开启4个线程分别去执行,主线程阻塞在WaitHandle.WaitAll(autoEvents)处,等待3个计算步骤的完成。4个ResetEvent初始化状态都是非终止(构造实例时传入了false),CalculateBase首先执行完毕,其他3个线程阻塞在manualEvent.WaitOne()处,等待CalculateBase执行完成。CalculateBase生成baseNumber后,把代表自己的ManualEvent状态设置为终止状态。其他几个线程从manualEvent.WaitOne()处恢复执行,在执行完自己的代码后把自己对应的AutoResetEvent状态置为终止。当3个计算步骤执行完后,主线程从阻塞中恢复,把三个计算结果累加后返回。还要多补充一点的是WaitHandle的WaitOne,WaitAll,WaitAny方法,如果等待多个进程就用WaitAll,如本例中的:WaitHandle.WaitAll(autoEvents),WaitAny是等待的线程中有一个结束则停止等待。
  Mutex 对象
   Mutex与Monitor类似,这里不再累赘,需要注意的是Mutex分两种:一种是本地Mutex一种是系统级Mutex,系统级Mutex可以用来进行跨进程间的线程的同步。尽管 mutex 可以用于进程内的线程同步,但是使用 Monitor 通常更为可取,因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源。相比之下,Mutex 类是 Win32 构造的包装。尽管 mutex 比监视器更为强大,但是相对于 Monitor 类,它所需要的互操作转换更消耗计算资源。
  注:文中代码示例来源于MSDN和CodeProject 
    

(编辑:IT资讯之家 www.it55.com

返回顶部
共3页: 上一页 [1] [2] 3 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]