Sun Studio 12: スレッドアナライザユーザーズガイド

2.5.2 異なるスレッドによって再利用されるメモリー

メモリー管理ルーチンには、別のスレッドが使用できるように、スレッドによって解放されたメモリーを再利用するものがあります。スレッドアナライザは、異なるスレッドによって使用される同じ位置のメモリーについて、使用される期間を正しく認識することができない場合があります。この時、スレッドアナライザは誤検出データ競合を報告します。次は、この種の誤検出データ競合の例です。

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