【问题标题】:Does blocked thread incur performance penalty?阻塞的线程会导致性能损失吗?
【发布时间】:2015-12-27 15:25:49
【问题描述】:

我有一个方法需要访问一个静态数组并进行一些繁重的计算。

public void DoIt(){
  lock(myStaticArray){
    // do crazy stuff
  }
}

该方法需要一到两秒才能完成,因此获取锁定所需的纳秒数在这里并不重要。

现在假设有 10 个线程到达代码并输入了一个。现在它是否使线程内的运行代码比没有线程等待锁要慢?等待锁定的阻塞线程在等待期间是否会消耗任何 CPU 使用率?

【问题讨论】:

  • 可以看Monitor.Enter的实现看实际代码。它可能会旋转等待几次,然后阻塞所述线程。我认为您的数组计算的开销可以忽略不计。

标签: c# multithreading


【解决方案1】:

简单的答案是否定的,由于其他线程在锁上等待,对正在运行的线程(正在做“疯狂事情”的线程)没有明显的 CPU 影响。

正如 cmets 中提到的,线程可能会在很短的时间内旋转等待(“忙等待”,它们正在使用 CPU 时间),这将花费一定的非常微不足道的 CPU 时间,然后它们会离开进入等待状态,这意味着它们不会在 CPU 上被调度,直到它们正在等待的对象发出信号(意味着正在工作的线程离开锁)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多