メモリー再利用、子タスク

2 つのタスクが共有メモリー位置へ書き込みを行うと発生します。親タスクが、それ以前に実行された子タスクで読み取られた変数に新しい値を上書きします。子タスクは別のタスクで入れ子になったタスクです。

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

ID

コードの場所

説明

1

割り当てサイト

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

2

並列サイト

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

3

読み取り

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

4

書き込み

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

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

この例では、タスクが共有変数を読み取った後に、親タスクが同じ共有変数に書き込みを行っています。

修正方法

子タスクを実行する前に、変数のプライベート・コピーを作成します。子タスクではプライベート・コピーを使用します。