跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:线程分析器用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
线程分析器是性能分析器的一个专门视图,设计用于检查线程分析实验。可使用一个单独的命令 tha 将性能分析器启动到该专门视图下,以这种方式启动的该工具称为线程分析器。
线程分析器可以显示您专门生成的用来检查相应数据类型的实验中的数据争用和死锁,如本文档中所述。
线程分析器可检测多线程进程执行期间发生的数据争用。满足以下所有条件时,就会发生数据争用:
一个进程内的两个或多个线程同时访问同一内存位置
至少其中一个访问是用于写入
线程未使用任何独占锁定来控制它们对该内存的访问
这三个条件成立时,访问的顺序是不确定的,每次运行的计算结果都可能因该顺序而异。有些数据争用可能是良性的(例如,内存访问用于忙等待时),但许多数据争用都属于程序中的错误。
线程分析器适用于用 POSIX 线程 API、Solaris 线程 API、OpenMP 或混用这几者编写的多线程程序。
死锁描述的是两个或多个线程由于相互等待而永远被阻塞的情况。导致死锁的原因有很多。线程分析器可检测由于不恰当使用互斥锁而导致的死锁。此类死锁通常发生在多线程应用程序中。
满足以下所有条件时,包含两个或多个线程的进程可能会进入死锁状态:
已持有锁的线程请求新锁
同时发出对新锁的请求
两个或多个线程形成一个循环链,其中每个线程都在等待链中下一个线程持有的锁
以下是一个死锁情况的简单示例:
线程 1 持有锁 A 并请求锁 B
线程 2 持有锁 B 并请求锁 A
死锁可分为两种类型:潜在死锁或实际死锁。潜在死锁不一定在给定的运行过程中发生,但可能发生在程序的任何执行过程中,具体取决于线程的调度情况以及线程进行锁请求的时间。实际死锁是在程序执行过程中发生的死锁。实际死锁会导致所涉及的线程挂起,但不一定会导致整个进程挂起。