Oracle® Solaris Studio 12.4:线程分析器用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

由不同线程回收的内存

有些内存管理例程负责回收由一个线程释放的内存,以供另一个线程使用。由不同线程使用的同一内存位置的使用期限不会重叠,线程分析器有时无法认识这一点。发生这种情况时,该工具可能会误报数据争用。以下示例将说明此类误报。

/*----------*/                    /*----------*/
/* Thread 1 */                    /* Thread 2 */
/*----------*/                    /*----------*/
 ptr1 = mymalloc(sizeof(data_t));
 ptr1->data = ...
 ...
 myfree(ptr1);

                                  ptr2 = mymalloc(sizeof(data_t));
                                  ptr2->data = ...
                                  ...
                                  myfree(ptr2);

线程 1 和线程 2 同时执行。每个线程都会分配一个用作专用内存的内存块。mymalloc() 例程可能会提供先前由 myfree() 调用所释放的内存。如果线程 2 在线程 1 调用 myfree() 之前调用 mymalloc(),则 ptr1ptr2 会获得不同的值,并且在这两个线程之间不存在数据争用。但是,如果线程 2 在线程 1 调用 myfree() 之后调用 mymalloc(),则 ptr1ptr2 可能会具有相同的值。由于线程 1 不再访问该内存,所以不存在数据争用。但是,如果该工具不知道 mymalloc() 正在回收内存,它会报告 ptr1 数据的写入与 ptr2 数据的写入之间存在数据争用。在 C++ 应用程序中,当 C++ 运行时库回收临时变量的内存时,经常发生此类误报。在实现自己的内存管理例程的用户应用程序中,也经常发生此类误报。目前,线程分析器能够识别通过标准 malloc()calloc()realloc() 接口执行的内存分配和释放操作。