Sun Studio 12:线程分析器用户指南

第 1 章 什么是线程分析器?它有何作用?

线程分析器是一种可用来分析多线程程序执行的工具。它可以检测多线程编程错误,如代码中的数据争用或死锁,其中代码是使用 POSIX 线程 API、Solaris 操作系统(R) 线程 API、OpenMP 指令、Sun 并行指令、Cray(R) 并行指令或混合使用前面各项编写的。

1.1 线程分析器入门

可以使用新增的 tha 命令启动线程分析器。线程分析器界面针对多线程程序分析进行了简化,从而不再显示传统的分析器选项卡,而是显示新的 Races(争用)、“死锁”、“双重数据源”、Race Details(争用详细信息)以及“死锁详细信息”选项卡。如果使用分析器查看相同的多线程程序实验,则将看到传统的分析器选项卡(如“函数”、“调用者与被调用者”、“反汇编”以及新增的选项卡。

线程分析器支持以下硬件和操作系统:

1.2 什么是数据争用?

线程分析器检测在执行多线程进程的过程中发生的数据争用。在以下情况下会发生数据争用:

这三个条件成立时,访问顺序是不确定的,在不同运行中计算提供的结果可能随该顺序而异。有些数据争用可能是良性的(例如,当内存访问用于忙等待时),但是很多数据争用都是程序中的错误。

线程分析器适用于使用 POSIX 线程 API、Solaris 线程 API、OpenMP、Sun 并行指令、Cray 并行指令或上述项的混合编写的多线程程序。

1.3 什么是死锁?

死锁描述两个或多个线程因相互等待而被永远阻塞(挂起)的情况。导致死锁的原因有多种。线程分析器可检测到因不正确使用互斥锁而导致的死锁。这种类型的死锁在多线程应用程序中比较常见。以下条件成立时,具有两个或多个线程的进程可能会进入死锁状态:

以下是一个死锁情况的简单示例:

线程 1 持有锁 A 并请求锁 B 

线程 2 持有锁 B 并请求锁 A 

死锁可能属于两种类型:潜在死锁或实际死锁。潜在死锁不一定在给定运行中发生,但是它可能发生在程序的任何执行过程中,具体取决于线程的调度和线程的锁定请求的时限。实际死锁是在执行程序的过程中发生的死锁。实际死锁会导致所涉及的线程挂起,但是可能会也可能不会导致整个进程挂起。

1.4 线程分析器使用模型

以下步骤说明可以使用线程分析器解决多线程程序问题的过程。

  1. 对程序进行校验。有关更多信息,请参见2.2.1 对源代码进行校验

  2. 进行试验,然后使用不同的因素重复试验,如不同的输入数据、不同数目的线程、不同的循环计划,甚至不同的硬件。此重复有助于找出根源不确定的问题。

  3. 确定线程分析器揭示的多线程编程冲突是合法错误还是良性现象。

  4. 修复合法错误并重复试验。

  5. 如果线程分析器报告新的多线程编程冲突,请重复前面的两个步骤。