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

ほかのスレッドに対して不可視な変数

NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(DataExpr, ...))

NOTE(NOW_VISIBLE_TO_OTHER_THREADS(DataExpr, ...))

これらの注釈は関数定義の内側でのみ許可され、指定された式によって表される変数がほかのスレッドに対して可視状態であるかどうか、つまりは、ほかのスレッドがこの変数にアクセスできるかどうかをロック lint に伝えます。

また、通常は可視であると想定されている変数でも、この変数へのポインタを持ったスレッドが存在しないため、実際には不可視であることをロック lint に知らせるという注釈の使い方も一般的です。データをヒープの外に割り当てる場合など、こうした状況はしばしば起こります (ほかのスレッドにはまだその変数の構造が不可視であるため、ロックを保持せず安全に構造の初期化を行えます)。


Foo* p = (Foo*) malloc(sizeof(*p));
NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*p))
p->a = bar;
p->b = zot;
NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*p))
add_entry(&global_foo_list, p);

関数の呼び出しが、変数を可視にしたり、不可視にしたりするという副作用を持つことは絶対にありません。関数から戻る時点で、関数が原因となって起こる可視性に関する一切の変化は逆転します。