< 目次

偶発的な共有問題の有無を確認

タスクの動的範囲のいずれかでメモリー位置が読み取られる前に、タスクがメモリー位置への書き込みを行う場合にのみ共有は偶発的です。タスクが数行で構成される単一の関数である場合、これは容易に確認できます。タスクが数百また数千行のコードで構成され、複数のソースファイルで多くの関数呼び出しを行う場合、これは困難になります。

さらに悪いことは、タスクがメモリー位置に書き込んだ値を、タスクが完了した後に実行されるコードやタスクと同時実行される可能性があるほかのタスクが読み取ることができる場合、共有は偶発的ではありません。

この条件を満たしているかどうか証明する完全な方法はありませんが、有用で簡単な手法があります。ANNOTATE_ITERATION_TASK(taskname); の直後に明らかに不正な値をメモリー位置に書き込む文を追加して、シリアルプログラムをテストします。共有が偶発的である場合、代入には影響しません。そうでない場合、変更によりプログラムの動作が変わる可能性があります。もちろん、この手法の有効性は、テストシステムの問題検出能力に依存します。

例えば、the_task() で変数 x が偶発的に共有されることを確認するには、次のように記述します。

extern int x;
// ...
ANNOTATE_SITE_BEGIN(site1); 
for (i = 0; i != n; ++i) {
    ANNOTATE_ITERATION_TASK(task1);
    x = 0xdeadbeef;
    the_task();
    x = 0xdeadbeef;
}
ANNOTATE_SITE_BEGIN();

散発的なメモリー参照を特定するには、C/C++ の特殊用途のアノテーション ANNOTATE_OBSERVE_USES()ANNOTATE_CLEAR_USES() の使用を検討してください。

関連情報