有些内存管理例程负责回收由一个线程释放的内存,以供另一个线程使用。由不同线程使用的同一内存位置的使用期限不会重叠,线程分析器有时无法认识这一点。发生这种情况时,该工具可能会误报数据争用。以下示例将说明此类误报。
/*----------*/ /*----------*/ /* 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(),则 ptr1 和 ptr2 会获得不同的值,并且在这两个线程之间不存在数据争用。但是,如果线程 2 在线程 1 调用 myfree() 之后调用 mymalloc(),则 ptr1 和 ptr2 可能会具有相同的值。由于线程 1 不再访问该内存,所以不存在数据争用。但是,如果该工具不知道 mymalloc() 正在回收内存,它会报告 ptr1 数据的写入与 ptr2 数据的写入之间存在数据争用。在 C++ 应用程序中,当 C++ 运行时库回收临时变量的内存时,经常发生此类误报。在实现自己的内存管理例程的用户应用程序中,也经常发生此类误报。目前,线程分析器能够识别通过标准 malloc()、calloc() 和 realloc() 接口执行的内存分配和释放操作。