データ通信

異なるタスクが読み取りを行う値に、タスクが書き込みを行った際に発生します。

問題のタイプ: データ通信

ID

コードの場所

説明

1

割り当てサイト

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

2

並列サイト

存在する場合、データ通信の問題を含む並列サイトの開始位置と関連するコールスタックを示します。

3

書き込み

メモリーを書き込んだ命令と関連するコールスタックを示します。

4

読み取り

別のタスクの実行でメモリーが読み取られた命令と関連するコールスタックを示します。

この例では、タスク 2 が読み取りを行う前もしくは後に、タスク 1 がヒープ変数への書き込みを行います。

void problem() { 
     int* pointer = new int; 											// 割り当てサイト 
     ANNOTATE_SITE_BEGIN(datacomm_site1);  // 並列サイト開始 
          ANNOTATE_TASK_BEGIN(task1); 
               *pointer = 999; 											// 書き込み
          ANNOTATE_TASK_END(); 
          ANNOTATE_TASK_BEGIN(task2); 
               assert(*pointer == 999); 							// 読み取り
          ANNOTATE_TASK_END(); 
     ANNOTATE_SITE_END(); 
}

この例では、それぞれのタスクの実行で変数communicationを読み取り、変数の内容に 1 を加算して結果を書き戻しています。それぞれのタスク実行における書き込みは、他のタスク範囲の実行が読み取りを行う前か後に行われます。

void data_communication() { 
ANNOTATE_SITE_BEGIN(site);        // 並列サイト 
     for (int i = 0; i < 2; i++) { 
     ANNOTATE_TASK_BEGIN(task);  // 異なるタスクの実行で書き込み及び読み取り 
          communication++; 
          /* データ通信 */ 
     ANNOTATE_TASK_END(); 
     } 
ANNOTATE_SITE_END(); 
}

修正方法

関連情報