メモリー再利用

2 つのタスクが同じ共有メモリーの位置に書き込みを行うと発生します。タスクは新しい値を変数に書き込みますが、先行するタスクによって書き込まれた値を読み取りません。

次のいずれかの条件が発生しました。

問題のタイプ: メモリー再利用

問題のタイプ: メモリー再利用

ID

コードの場所

説明

1

割り当てサイト

存在しヒープメモリーに関連する場合、メモリーが割り当てられた場所と関連するコールスタックを示します。

2

並列サイト

存在する場合、メモリーの再利用の問題を含む並列サイトの位置と関連するコールスタックを示します。

3

読み取り

最初のアクセスがメモリー読み取りの場合、アクセスした命令と関連するコールスタックを示します。

4

書き込み

2 番目のアクセスがメモリー書き込みの場合、アクセスした命令と関連するコールスタックを示します。

5

書き込み

最初のアクセスがメモリー書き込みの場合、アクセスした命令と関連するコールスタックを示します。

int global; 
void main() { 
     ANNOTATE_SITE_BEGIN(reuse_site); // 並列サイト開始 
          ANNOTATE_TASK_BEGIN(task111); 
               global = 111; 								// 読み取り/書き込み 
               assert(global == 111); 
          ANNOTATE_TASK_END(); 
          ANNOTATE_TASK_BEGIN(task222); 
               global = 222; 								// 書き込み 
               assert(global == 222); 
          ANNOTATE_TASK_END(); 
     ANNOTATE_SITE_END(); 
}

この例では、2 つのタスクは同じ global 変数を使用します。それぞれのタスクは、別のタスクが書き込んだ値を読み取らないか、受け取らないことになります。

修正方法

タスクが変数を共有せずに、個別のプライベート変数を持つように変更します。