JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:线程分析器用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  什么是线程分析器?它有什么作用?

2.  数据争用教程

3.  死锁教程

3.1 关于死锁

3.2 获取死锁教程源文件

3.2.1 din_philo.c 的源代码内容

3.3 哲学家就餐方案

3.3.1 哲学家如何发生死锁

3.3.2 为 1 号哲学家引入一段休眠时间

3.4 如何使用线程分析器查找死锁

3.4.1 编译源代码

3.4.2 创建死锁检测实验

3.4.3 检查死锁检测实验

3.4.3.1 使用线程分析器查看死锁检测实验

3.4.3.2 使用 er_print 查看死锁检测实验

3.5 了解死锁实验结果

3.5.1 检查出现死锁的运行

3.5.2 检查存在潜在死锁但仍可完成的运行

3.6 修复死锁和了解误报

3.6.1 使用令牌控制哲学家

3.6.1.1 误报的报告

3.6.2 另一种令牌机制

A.  线程分析器可识别的 API

B.  有用提示

3.4 如何使用线程分析器查找死锁

可以使用线程分析器检查程序中的潜在死锁和实际死锁。线程分析器沿用与 Oracle Solaris Studio 性能分析器相同的收集-分析模型。

使用线程分析器的过程涉及三个步骤:

3.4.1 编译源代码

编译代码并务必指定 -g。不要指定高优化级别,因为在高优化级别时报告的信息(如行号和调用堆栈)可能是错误的。应使用 -g -xopenmp=noopt 编译 OpenMP 程序,并仅使用 -g -mt 编译 POSIX 线程程序。

有关这些选项的更多信息,请参见 cc(1)、CC(1) 或 f95(1) 手册页。

对于本教程,请使用以下命令编译代码:

% cc -g -o din_philo din_philo.c

3.4.2 创建死锁检测实验

使用线程分析器的带有 -r deadlock 选项的 collect 命令。此选项将在程序的执行期间创建死锁检测实验。

对于本教程,请使用以下命令创建名为 din_philo.1.er 的死锁检测实验:

% collect -r deadlock -o din_philo.1.er din_philo

可以通过创建多个死锁检测实验来提高检测到死锁的可能性。对于各个实验,应使用不同的线程数和不同的输入数据。例如,在 din_philo.c 代码中,可以更改以下行中的值:

    13  #define PHILOS 5
    14  #define DELAY 5000
    15  #define FOOD 100

然后可以像以前一样进行编译,并收集其他实验。

有关更多信息,请参见 collect(1) 和 collector(1) 手册页。

3.4.3 检查死锁检测实验

可以使用线程分析器、性能分析器或 er_print 实用程序检查死锁检测实验。线程分析器和性能分析器都提供 GUI 界面;线程分析器显示的是一组简化的缺省标签,但在其他方面与性能分析器完全相同。

3.4.3.1 使用线程分析器查看死锁检测实验

要启动线程分析器并打开 din_philo.1.er 实验,请键入以下命令:

% tha din_philo.1.er

线程分析器包含菜单栏、工具栏以及包含多个标签的拆分窗格(不同标签对应不同的显示)。

打开收集的死锁检测实验时,缺省情况下会在左侧窗格中显示以下标签:

线程分析器显示屏的右侧窗格中会显示以下标签:

3.4.3.2 使用 er_print 查看死锁检测实验

er_print 实用程序提供命令行界面。可以在交互式会话中使用 er_print 实用程序并在该会话期间指定子命令。也可以使用命令行选项以非交互方式指定子命令。

使用 er_print 实用程序检查死锁时,以下子命令非常有用:

有关更多信息,请参阅 collect(1)、tha(1)、analyzer(1) 和 er_print(1) 手册页。