有人能简单地解释一下什么是线程争用吗?
我查了谷歌,但似乎找不到简单明了的解释。
有人能简单地解释一下什么是线程争用吗?
我查了谷歌,但似乎找不到简单明了的解释。
很多答案似乎都集中在锁竞争上,但锁并不是唯一可能发生争用的资源。争用指当两个线程试图以某种方式访问同一资源或相关资源时,至少有一个争用线程的运行速度比如果其他线程未运行则更慢。
最明显的争用例子是在锁上。如果线程A获取了锁,而线程B想要获取相同的锁,那么线程B将必须等待直到线程A释放锁。
现在,这个问题具体取决于平台,但即使它从来没有等待另一个线程释放锁,该线程也可能会经历减速!这是因为锁保护某些数据,而数据本身也经常会被争用。
例如,考虑一个线程获取锁、修改对象,然后释放锁并执行其他操作。如果有两个线程这样做,即使它们从不为锁而战,线程也可能比只有一个线程运行时慢得多。
为什么?假设每个线程在现代x86 CPU的自己核心上运行且核心不共享L2缓存。对于只有一个线程,对象大部分时间可能都在L2缓存中。如果两个线程都在运行,每当一个线程修改对象时,另一个线程将发现数据不在其L2缓存中,因为另一个CPU使缓存行无效。例如,在Pentium D上,这将导致代码运行在FSB速度,比L2缓存速度慢得多。
由于即使锁本身没有被争用也可能发生争用,因此在没有锁的情况下,争用也可能会发生。例如,假设你的CPU支持32位变量的原子递增。如果一个线程不断地递增和递减一个变量,该变量将大部分时间保留在缓存中。如果两个线程这样做,它们的缓存将争夺拥有该变量的内存,并且许多访问将变慢,因为缓存一致性协议操作来确保每个核心拥有缓存行的所有权。
具有讽刺意味的是,锁通常会减少竞争。为什么呢?因为没有锁,两个线程可能会在同一个对象或集合上操作,并引起很多竞争(例如,无锁队列)。锁将倾向于取消争用的线程,允许非争用的线程运行。如果线程A持有锁,而线程B也想要相同的锁,实现可以运行线程C。如果线程C不需要该锁,则可以暂时避免线程A和B之间的未来竞争(当然,这假设存在其他线程可以运行。如果系统整体只能通过运行争用线程来取得实用进展,则无济于事)。
线程争用本质上是一个条件,其中一个线程正在等待由另一个线程持有的锁/对象。因此,这个等待线程在另一个线程解锁该特定对象之前不能使用该对象。
来自这里:
当线程等待一个资源无法立即使用时,就会发生争用(contention);这会减缓代码的执行速度,但随着时间的推移可能会消失。
当一个线程等待第二个线程锁定的资源,而第二个线程又等待第一个线程锁定的资源时,就会发生死锁(deadlock)。多个线程可能会涉及到死锁。死锁永远不会自动解决,通常会导致整个应用程序或遇到死锁的部分停止运行。
您有两个线程,分别是线程A和线程B,同时还有对象C。
线程A当前正在访问对象C,并已在该对象上放置了锁。 线程B需要访问对象C,但在A释放对象C的锁之前无法这样做。
另一个词可能是并发。它只是两个或更多线程尝试使用相同资源的想法。
线程争用也受I/O操作的影响。例如,当一个线程等待文件读取时,可以看作是一种争用。使用I/O完成端口作为解决方案。