タスクが終了する前にロックを解放しないと発生します。
ID |
コードの場所 |
説明 |
---|---|---|
1 |
割り当てサイト |
存在する場合、ロックが作成された場所と関連するコールスタックを示します。 |
2 |
ロック所有 |
存在する場合、ロックが最後に要求された場所と関連するコールスタックを示します。 |
3 |
並列サイト |
存在する場合、ロックを要求するタスクを含む並列サイトのサイト開始アノテーションの場所と関連するコールスタックを示します。 |
void problem() { ANNOTATE_SITE_BEGIN(dangle_site1); // 並列サイト ANNOTATE_TASK_BEGIN(task1); ANNOTATE_LOCK_ACQUIRE(&dangle); // ロックを所有 ANNOTATE_TASK_END(); // ... ANNOTATE_SITE_END(); }
この例では次のことが分かります。
タスクを含む並列サイトがあります。
タスク内でロックが取得されています。
タスクの終了前にロックが解放されていません。ANNOTATE_LOCK_RELEASE() アノテーションがありません。
すべての実行パスで、ANNOTATE_LOCK_RELEASE(address)アノテーションが、ANNOTATE_LOCK_ACQUIRE(address)アノテーションからタスクの終了までに実行されるのを確実にします。コード領域が複数の出口を持つ場合、すべての経路でロックが解放されることを確実にします。
ロックの解放が自動的に行われるように、静的オブジェクトのコンストラクターとデストラクターにロックの取得と解放を配置することを検討してください。
また、ロック領域を例外で終了する可能性がある場合、例外ハンドラーでロックの開放を行うことを検討してください。