none
使用Monitor、lock、AutoResetEvent、Semaphore同步关键代码段,请教效率 RRS feed

  • 问题

  • 一般情况下,人们可能比较习惯于lock,lock实际上是Monitor加上异常处理。所以效率应当比不起Monitor。

    用semaphore来同步关键代码段则显然是大材小用。其效率也应当比不上Monitor。

    Monitor是比较原汁原味的用法。

    由于我有一个需求:线程在退出关键代码段后立即开始等待一个事件。

    但Monitor并没有提供这样的功能,而通过WaitHandle.SignalAndWait函数则可以实现此需求。

    因此,我想使用AutoResetEvent来做这个同步。

    但不知AutoResetEvent的效率比之Monitor如何,请教?

     

    2010年5月28日 3:19

答案

  • 你好!

         除了Monitor类以外,你提到的其他同步方式都是传统的Win32 同步方式的封装,和使用传统的方式没有太大的区别,互斥体,信号量,事件等都是系统资源,有一定的性能开销,比Monitor性能要差一些,但是Monitor只能在单一进程内使用,这是他的缺点!而传统的同步机制是可以对多个进程进行同步的!


    周雪峰
    • 已标记为答案 泉子 2010年5月29日 15:00
    2010年5月28日 4:31
    版主

全部回复

  • 你的线程同步成了性能瓶颈?那你的设计可能有问题。你可以把需要在线程之间交换的数据缓存下来,定时进行批量交换。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月28日 4:12
    版主
  • 你好!

         除了Monitor类以外,你提到的其他同步方式都是传统的Win32 同步方式的封装,和使用传统的方式没有太大的区别,互斥体,信号量,事件等都是系统资源,有一定的性能开销,比Monitor性能要差一些,但是Monitor只能在单一进程内使用,这是他的缺点!而传统的同步机制是可以对多个进程进行同步的!


    周雪峰
    • 已标记为答案 泉子 2010年5月29日 15:00
    2010年5月28日 4:31
    版主
  • 哈,不是瓶颈,只是想写个对象缓存,若线程同步的开销比重复创建可能带来的垃圾回收开销还要大,岂不是得不偿失。
    2010年5月28日 5:10
  • 嗯,我也是希望避免使用内核级的对象。如果Monitor是性能最佳的选择,那请问有办法使用Monitor实现我的需求么?
    2010年5月28日 5:12
  • 你好!

         Monitor有个Pulse方法,你试试看能否满足需要!


    周雪峰
    2010年5月28日 6:18
    版主
  • Monitor Wait ,Pulse,PulseAll.容易死锁,小心控制.

    个人觉得AutoResetEvent已经足够,大多数场景都适用,比Monitor好控制.

    如果你非要再继续提高的话,你必须提供更详尽的需求,就算Monitor你用的非常完美了,仅仅也只是适用"线程在退出关键代码段后立即开始等待一个事件。"

    如果是

    1,"多个线程在退出关键代码段后立即开始等待一个事件。"

    2,"多个线程在退出关键代码段后立即开始等待多个事件。"

    3,"线程在退出关键I/O操作代码段后立即开始等待一个事件。" 

    等等,所以,这得看你的应用场景.你或许提高了"线程在退出关键代码段后立即开始等待一个事件"的执行效率,但是其它场景下你可能浪费了线程资源,比如线程数,线程切换数等等.

    2010年5月28日 6:41
  • 你好 我个人认为这几个不是效率的问题而是用途不同而已

    lock就是Monitor在语法上的封装;

    Semaphore主要用于控制信号量,比如对于同一个资源你限制同时最大90个线程读取,用这个类是很好的;

    AutoResetEvent如Galactica所述


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~
    2010年5月28日 7:24
    版主
  • 线程多的话应该考虑线程池

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月31日 5:32
    版主