在开始之前,必须完成练习 1.2:收集线程数据。
“线程视图”显示应用程序中所有线程的状态,并明确指出线程死锁和争用。
要查找瓶颈:
我们感兴趣的是线程之间的垂直箭头。箭头指出一个线程(箭头开始的线程)正在等待另一线程(箭头指向的线程)释放锁定。双箭头指出两个线程处于死锁状态,都在等待对方释放锁定。
在程序启动后不久,将一个接一个地创建四个 philo* 线程。每个线程都运行较短时间,然后发出锁定请求。请求不成功。当前三个锁定请求失败时,这些线程将进入等待锁定状态。当第四个线程的锁定请求失败时,就出现死锁,并且显示指示所有四个线程都处于死锁状态。
该 philo* 线程正在等待来自其它 philo* 的锁定,后者也正在等待锁定。
在这种情况下,就进入了死锁:程序进入了不能继续的僵局。
注意:通过将光标停留在特定线程段上,可以看到有关锁定请求、死锁和其它状态的特定信息。例如,这将显示一个工具提示,指定锁定的名称并指出占有该锁定的线程(“锁定线程”)。
既然您了解发生此死锁的原因,就可以开始练习 1.4:解决线程瓶颈了。