メモリー管理ルーチンには、別のスレッドが使用できるように、スレッドによって解放されたメモリーを再利用するものがあります。スレッドアナライザは、異なるスレッドによって使用される同じ位置のメモリーについて、使用される期間を正しく認識することができない場合があります。この時、スレッドアナライザは誤検出データ競合を報告します。次は、この種の誤検出データ競合の例です。
/*----------*/ /*----------*/ /* スレッド 1 */ /* スレッド 2 */ /*----------*/ /*----------*/ ptr1 = mymalloc(sizeof(data_t)); ptr1->data = ... ... myfree(ptr1); ptr2 = mymalloc(sizeof(data_t)); ptr2->data = ... ... myfree(ptr2);
スレッド 1 と 2 は同時に実行され、それぞれ専用メモリーとして使用する大量のメモリーを割り当てます。ここで、mymalloc() ルーチンは、直前の myfree() の呼び出しによって解放されたメモリーを供給すると仮定します。スレッド 1 が myfree() を呼び出す前にスレッド 2 が mymalloc() を呼び出した場合、ptr1 と ptr2 は異なる値を取得し、2 つのスレッドの間にデータ競合はありません。ただし、スレッド 1 が myfree() を呼び出したあとでスレッド 2 が mymalloc() を呼び出した場合は、ptr1 と ptr2 は同じ値を持つ可能性があります。スレッド 1 はそのメモリーにアクセスしなくなっているため、データ競合はありません。しかし、mymalloc() がメモリーを再利用していることを認識していない場合、スレッドアナライザは ptr1 データの write と ptr2 データの書き込みの間にデータ競合があると報告します。この種の誤検出は、C++ アプリケーションで C++ ランタイムライブラリが一時変数用のメモリーを再利用する場合に起こることがよくあります。また、独自のメモリー管理ルーチンを実装しているユーザーアプリケーションでもよく起きます。現状では、スレッドアナライザは標準の malloc()、calloc()、および realloc() インタフェースを使用して実行されるメモリーの割り当てと解放操作を認識できます。