プログラムのパフォーマンス解析

シングルスレッド化コード

NOTE(COMPETING_THREADS_NOW)

NOTE(NO_COMPETING_THREADS_NOW)

これらの 2 つの注釈は、関数定義の内側でのみ使用可能です。1 つ目の注釈は、コードのこのポイントの後に、このスレッドがアクセスするデータと同じデータにアクセスしようとするほかのスレッドが存在することをロック lint に伝えます。2 つ目の注釈は、もはやそうした状態ではないこと (ほかに実行中のスレッドはない、あるいは、実行中のいかなるスレッドもこのスレッドがアクセスしているデータにアクセスすることはないなど) を指定します。競合するスレッドが存在しなければ、ロック lint は、通常はそのデータを保護するロックを保持することなくそのコードがデータにアクセスするかどうかについて、不具合を報告することはありません。

これらの注釈は、追加のスレッドを 1 つも起動しないうちに、ロックを保持せずにデータを初期化する関数において有用です。こうした関数は、ほかのすべてのスレッドが終了するのを待った後、ロックを保持せずにデータにアクセスすることを許可されます。その具体例を以下に示します。


main() {
    <initialize data structures>
    NOTE(COMPETING_THREADS_NOW)
    <create several threads>
    <wait for all of those threads to exit>
    NOTE(NO_COMPETING_THREADS_NOW)
    <look at data structures and print results>
}


注 -

NOTE が main() に存在する場合、ロック lint は、main() の開始時に、ほかのスレッドが実行中でないと想定します。main()NOTE が含まれない場合は、その想定はしません。


競合スレッドが存在しているとすでに想定されている場合は、解析中に注釈 COMPETING_THREADS_NOW に出会っても、ロック lint は警告を発しません。たとえば、単純な入れ子構造の場合がそうです。注釈は各使用時に異なる意味を示すことができるため、警告メッセージは表示されません (概念的には、スレッドの競合とは、コードの一部分が次のコードと異なる場合を意味します)。一方、先行する COMPETING_THREADS_NOW 注釈 (明示的でも非明示的でも) と一致しない NO_COMPETING_THREADS_NOW 注釈は、警告の原因となります。