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.  死锁教程

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

A.1 线程分析器用户 API

A.2 其他可识别的 API

A.2.1 POSIX 线程 API

A.2.2 Solaris 线程 API

A.2.3 内存分配 API

A.2.4 内存操作 API

A.2.5 字符串操作 API

A.2.6 OpenMP API

B.  有用提示

A.1 线程分析器用户 API

如果代码包含用户定义的同步,请将线程分析器支持的用户 API 插入该程序中来标识这些同步。通过此标识,线程分析器可识别这些同步并减少误报的数量。下面列出了在 libtha.so 中定义的线程分析器用户 API。

表 A-1 线程分析器用户 API

tha_notify_acquire_lock()
可以在程序尝试获取用户定义的锁之前立即调用此例程。
tha_notify_lock_acquired()
可以在成功获取用户定义的锁之后立即调用此例程。
tha_notify_acquire_writelock()
可以在程序尝试以写入模式获取用户定义的读/写锁之前立即调用此例程。
tha_notify_writelock_acquired()
可以在以读取模式成功获取用户定义的读/写锁之后立即调用此例程。
tha_notify_acquire_readlock()
可以在程序尝试以读取模式获取用户定义的读/写锁之前立即调用此例程。
tha_notify_readlock_acquired()
可以在以读取模式成功获取用户定义的读/写锁之后立即调用此例程。
tha_notify_release_lock()
可以在释放用户定义的锁或读/写锁之前立即调用此例程。
tha_notify_lock_released()
可以在成功释放用户定义的锁或读/写锁之后立即调用此例程。
tha_notify_sync_post_begin()
可以在执行用户定义的后期同步之前立即调用此例程。
tha_notify_sync_post_end()
可以在执行用户定义的后期同步之后立即调用此例程。
tha_notify_sync_wait_begin()
可以在执行用户定义的等待同步之前立即调用此例程。
tha_notify_sync_wait_end()
可以在执行用户定义的等待同步之后立即调用此例程。
tha_check_datarace_mem()
该例程指示线程分析器在执行数据争用检测时监视或忽略对指定内存块的访问。
tha_check_datarace_thr()
该例程指示线程分析器在执行数据争用检测时监视或忽略一个或多个线程进行的内存访问。

提供了 C/C++ 版本和 Fortran 版本的 API。每次 API 调用都采用单个参数 ID,其值应该唯一地标识同步对象。

在 C/C++ 版本的 API 中,参数的类型为 uintptr_t,在 32 位模式下长度为 4 个字节,在 64 位模式下长度为 8 个字节。在调用此版本的任何 API 时,都需要将 #include <tha_interface.h> 添加到 C/C++ 源文件中。

在 Fortran 版本的 API 中,参数的类型为整型 tha_sobj_kind,在 32 位模式和 64 位模式下长度均为 8 个字节。在调用此版本的任何 API 时,都需要将 #include "tha_finterface.h" 添加到 Fortran 源文件中。

为了唯一地标识同步对象,对于每个不同的同步对象,参数 ID 应具有不同的值。其中一种做法是将同步对象的地址值用作 ID。以下代码示例说明了如何使用 API 避免误报数据争用。

示例 A-1 使用线程分析器 API 避免误报数据争用的示例

# include <tha_interface.h>
...
/* Initially, the ready_flag value is zero */
...
/* Thread 1: Producer */
100   data = ...
101   pthread_mutex_lock (&mutex);
      tha_notify_sync_post_begin ((uintptr_t) &ready_flag);
102   ready_flag = 1;
      tha_notify_sync_post_end ((uintptr_t) &ready_flag);

103   pthread_cond_signal (&cond);
104   pthread_mutex_unlock (&mutex);
 
 
/* Thread 2: Consumer */
200   pthread_mutex_lock (&mutex);
      tha_notify_sync_wait_begin ((uintptr_t) &ready_flag);
201   while (!ready_flag) {
202       pthread_cond_wait (&cond, &mutex);   
203   }
      tha_notify_sync_wait_end ((uintptr_t) &ready_flag);
204   pthread_mutex_unlock (&mutex);
205   ... = data;

有关用户 API 的更多信息,请参见 libtha(3) 手册页。