タスクの実行が別のロックの制御下でメモリー位置に複数回アクセスすると発生します。
次のいずれかの条件が発生しました。



ID |
コードの場所 |
説明 |
|---|---|---|
1 |
割り当てサイト |
存在する場合、メモリーが割り当てられた場所と関連するコールスタックを示します。 |
2 |
並列サイト |
存在する場合、一貫性のないロックの使用問題を含む並列サイトの位置と関連するコールスタックを示します。 |
3 |
読み取り |
最初のアクセスがメモリー読み取りの場合、アクセスした命令と関連するコールスタックを示します。 |
4 |
書き込み |
2 番目のアクセスがメモリー書き込みの場合、アクセスした命令と関連するコールスタックを示します。 |
5 |
読み取り |
それがメモリー読み取りであれば、2 番目にアクセスした場所と関連するコールスタックを示します。 |
6 |
書き込み |
最初のアクセスがメモリー書き込みの場合、アクセスした命令と関連するコールスタックを示します。 |
// 並列サイト
ANNOTATE_TASK_BEGIN(task);
for (int i = 0; i < N; i++) {
ANNOTATE_LOCK_ACQUIRE(1);
a[i][j0]++; // 読み取り/書き込み
ANNOTATE_LOCK_RELEASE(1);
}
for (int j = 0; i < N; i++) {
ANNOTATE_LOCK_ACQUIRE(2);
a[i0][j]++; // 読み取り/書き込み
ANNOTATE_LOCK_RELEASE(2);
}
ANNOTATE_TASK_END();例えば、a[i0][j0] は、最初のループのロック 1 と 2 番目のループのロック 2 によってアクセスされます。別のタスクのアクセスでは、これら両方のアクセスと競合するのを避けるため適切なロックの組み合わせがありません。
同じロックを使用する同じメモリー位置へのすべてのアクセスをロックします。