【问题标题】:Is 'Lock' taking CPU time?“锁定”是否占用 CPU 时间?
【发布时间】:2012-02-21 19:13:19
【问题描述】:

我有 6 个线程。 其中一个线程进入某个范围并打开“锁”,而其他所有线程 线程正在等待并希望进入相同的范围。

现在,其他线程会获得 CPU 时间吗?其他线程是否在线程调度中? 我知道所有其他线程都处于等待状态 - 但 CPU 会尝试让线程继续并尝试进入范围(即使范围不可访问)

【问题讨论】:

  • 我的理解是,其他线程还是会收到时间片,用来检查锁的状态。如果锁还在,他们将重新进入睡眠状态,否则他们将继续。
  • 这也是我所理解的——但这需要 CPU 时间......所以这有点忙等待——这非常糟糕。

标签: c# .net clr


【解决方案1】:

当试图进入一个已经被占用的锁时,线程首先自旋锁一段时间,最后挂起并进入等待状态。

它们在旋转时仍会消耗 CPU 时间,但一旦等待就不再消耗。

【讨论】:

  • 稍微扩展一下:spinwait 已经完成,因为它比内核转换更便宜,因此可以优化锁只是轻微竞争的情况。
  • 什么是自旋锁?你能用1句话回答吗?
  • @Royi 线程不断检查外观是否在循环中空闲。像while(!lock.TryEnter()){} 这样的东西会烧 CPU,但避免了内核转换和线程调度的开销。如果锁很快就会释放是好的,但如果需要更长的时间就不好了。这就是为什么lock 自旋锁一小会儿,然后等待。
【解决方案2】:

锁不是这样工作的。你不会给任何人更多的“cpu时间”。如果您正在锁定,您可能会引入等待期,并可能导致线程相互等待的死锁。

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2011-12-15
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2017-10-19
    • 2011-05-05
    • 2012-01-31
    相关资源
    最近更新 更多