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

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();
}
同じメモリーへの 2 つのアクセスが特定の順番で行われる必要がある場合、単一サイト実行内の異なるタスク実行によるアクセスであってはなりません。サイトとタスクの構造を変更する必要があります。
2 つのタスク実行によるメモリー変更の順番は重要ではありませんが、変更が同時に行われないようにするには、ロックを使用して同期します。
インダクションとリダクションのアノテーションは、アクセスの順番に関係なくプログラムが正しく動作することを依存関係ツ-ルに通知します。