如何在C语言中声明一个函数指针,使得指针本身是volatile。
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指针的内容。
使用volatile指针和指向volatile的指针时有时会出现问题:
现在,事实证明指向volatile变量的指针非常常见。这两个声明都将foo声明为指向volatile整数的指针:
volatile int * foo;
int volatile * foo;
指向非volatile变量的volatile指针非常罕见(我想我只用过一次),但我最好还是给你语法:
int * volatile foo;
因此,我想获取指向函数的易失性指针,而不是指向“易失性”函数的指针。
谢谢
{barrier,pointer read,calling function}
)。我使用了一个具有大量可用寄存器的系统,因此编译器可以缓存许多变量。我是对的吗? - osgxvolatile
应该是不必要的。 - cafa=1; pthread_barrier(); b=a;
,pthread_barrier是一个错误的写法吗?编译器对该函数内部一无所知。编译器是否可以在该函数调用周围缓存变量a的值(在其看来,这是普通的函数调用)?编译器可以缓存任何非volatile变量。 - osgxpthread_barrier_wait()
必须充当编译器屏障(防止其它值被缓存越过该屏障)。实际上,并不需要特定的编译器支持,因为pthread_barrier_wait()
是一个外部函数,所以编译器必须假设它可能会修改任何全局变量或任何地址被取出的变量(换言之,从编译器的角度看,可能是pthread_barrier_wait()
修改了a
,而不是另一个线程)。 - caf