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

2.5.2 由不同线程再循环的内存

一些内存管理例程再循环线程释放的内存以供另一线程使用。线程分析器有时无法识别由不同线程使用的同一内存位置的使用期限不重叠。如果出现此情况,则该工具可能误报数据争用。以下示例说明此类误报。

   /*----------*/                         /*----------*/
    /* 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() 接口执行的内存分配和释放操作。