代码之家  ›  专栏  ›  技术社区  ›  Adibe7

使用锁是否比使用本地(单个应用程序)信号量具有更好的性能?

  •  3
  • Adibe7  · 技术社区  · 16 年前

    我从msdn上读到这个博客: Producer consumer solution on msdn

    我不喜欢他们解决这个问题的方法,因为队列中总有20个元素。

    因此,我考虑使用一个只在我的应用程序中可用的“信号量”(我只是不在构造函数中命名它),但我不知道它将如何影响应用程序的性能。

    有人知道这会不会影响演出吗?使用锁而不是“信号量”的其他考虑因素是什么?

    4 回复  |  直到 7 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    锁定(obj)与Monitor.Enter(目标);锁基本上是一元信号量。如果同一个ressource(N)有多个实例,则使用初始化值为N的信号量。锁主要用于确保代码段不被两个线程同时执行。

    SO thread 这关系到性能。

    对于您的问题,阻塞队列将是解决方案。(生产者消费者)我建议 this 很好,所以穿线。

    以下是另一个关于 Reusable Parallel Data Structures

        2
  •  8
  •   eddyP23    7 年前

    太长,读不下去了 lock 它的速度几乎是它的两倍 SemaphoreSlim(1) .

    规格 :

    • .NET核心 2.1.5
    • 视窗10
    • 2.5 GHz

    测试

    我试着跑2,4和6 Task 它们中的每一个都做了1M个操作,访问一个锁,做一个简单的操作并释放它。代码如下所示:

    await semaphoreSlim1.WaitAsync();
    // other case: lock(obj) {...}
    
    if(1 + 1 == 2)
    {
        count++;
    }        
    
    semaphoreSlim1.Release();
    

    结果 对于每种情况, 跑得几乎是你的两倍快 205ms 与 390ms 6

    请注意 ,我并不认为它在无限多的其他设置上更快。

        3
  •  2
  •   wj32    16 年前

    监视器(具有互斥+条件变量)可以实现也可以不实现旋转。那篇MSDN文章的实现没有,所以在本例中,性能没有真正的差别。无论如何,您仍然需要锁定才能将项目出列,除非您使用的是无锁队列。

        4
  •  1
  •   theburningmonk    16 年前

    请参阅本文,了解使用Monitor的不同实现:

    http://wekempf.spaces.live.com/blog/cns!D18C3EC06EA971CF!672.entry

        5
  •  1
  •   andrew pate    7 年前

    lock和semaphore slim是完全不同的,我会避免混淆它们。如果您正确地使用async,那么SemaphoreSlim是好的。