2012-02-21 56 views
7

我有6个主题。 其中一个线程进入某个范围并打开'锁定',所有其他线程正在等待并且想要进入相同的范围。'锁'需要CPU时间吗?

现在,其他线程是否会获得CPU时间?其他线程是否在线程安排中? 据我所知,所有其他线程处于等待状态 - 但CPU会尝试使线程继续并尝试进入示波器(即使示波器无法访问)

+1

我的理解是,其他线程仍然会收到时间片,他们将用它来检查锁的状态。如果锁仍然存在,他们会回去睡觉,否则他们会继续。 – xbonez 2012-02-21 11:11:09

+0

这就是我所了解的 - 但这需要CPU时间...所以这是一种繁忙的等待 - 这是非常糟糕的。 – Yanshof 2012-02-21 21:28:35

回答

10

当试图输入一个锁已经采取,先线程螺旋锁一段时间,最后挂起并进入等待状态。

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

+6

稍微扩展一下:spinwait的完成是因为它比内核转换更便宜,因此优化了锁只能轻微竞争的情况。 – Richard 2012-02-21 11:13:10

+0

什么是螺旋锁?你能用一句话回答吗? – 2012-04-30 21:38:39

+2

@罗伊线程一直在检查循环中的外观是否可用。类似'while(!lock.TryEnter()){}'烧毁CPU,但是避免了内核转换和线程调度的开销。如果锁定很快就会自由,这很好,但如果时间较长,这很不好。这就是为什么'锁定'spinlocks一会儿,然后等待。 – CodesInChaos 2012-04-30 21:45:21

0

这不是锁的工作原理。你不会给任何人更多的“CPU时间”。如果你正在锁定,你可能会引入等待时间和线程正在等待的潜在死锁。