ポインタ自体を揮発性にするために、Cで関数へのポインタを宣言する方法。C:関数への揮発性ポインタを宣言する
static void volatile (* f_pointer)(void*);
static void (volatile * f_pointer)(void*);
static void (* volatile f_pointer)(void*);
なぜ私はこれを聞いていますか?揮発性ポインタについてはhttp://wiki.answers.com/Q/Volatile_example_code_sample_coding_of_volatile_pointerで読んでいます。
揮発ポインタとポインタへの揮発性に問題時々あります
今は、それは volatile変数へのポインタは非常に共通していることが分かりました。 これらの宣言の両方が揮発性の整数へのポインタであることをFOO を宣言:非揮発性変数へ
volatile int * foo;
int volatile * foo;
揮発性ポインタは非常に稀である(私は一度それらを使用したと思う)、 しかし、私はより良い先に行くとあなたの構文を与えるだろう:
int * volatile foo;
だから、私は「揮発性」関数へのポインタではなく機能するように揮発性のポインタを取得したいです。
おかげ
なぜ関数への揮発性ポインタが必要ですか?誰がこのポインタを変更しようとしていますか?あなたは「揮発性」_really_が何を意味するか知っていますか? –
@James McNellis、はい、したいです。このポインタはスレッド0によって変更され、スレッド1..7で関数を開始するために使用されます。間に障壁がありますが、バリヤーに入る前にスレッド0のメモリーにこのポインターをフラッシュするようコンパイラーに指示します。また、スレッド1..7にこのポインタを再読み込みさせたい( 'barrier、pointer read、calling function 'のループがあります)。私は多くのレジスタを利用できるシステムを使用しているので、コンパイラは多くの変数をキャッシュすることがあります。私は正しい? – osgx
バリアが正しく書き込まれていれば、コンパイラは値をキャッシングするべきではありません。つまり、 'volatile'は不要です。 – caf