我已在several places中读到应使用volatile
关键字:
多线程应用程序中的多个任务访问的全局变量
我想确保我做对了 - 如果我有一个堆分配变量,比如说一个持有整数的结构,我应该使用volatile
还是应该将它视为非全局变量?
如果只应声明全局变量volatile
,为什么会有区别?
简单示例:
struct my_struct
{
int still_running;
int keep_running; // should it be declared 'int volatile'?
};
typedef struct my_struct *my_struct_t;
static void *my_thread_func(void *v)
{
my_struct_t s = (my_struct_t) v;
do
{
printf("thread still running.\n");
} while (s->keep_running);
printf("thread stopping.\n");
s->still_running = 0;
return NULL;
}
int main(int argc, char **argv)
{
my_struct_t s = (my_struct_t)malloc(sizeof(struct my_struct));
s->keep_running = 1;
s->still_running = 1;
pthread_t t;
pthread_create(&t, NULL, my_thread_func, s);
usleep(1000);
s->keep_running = 0;
while(s->still_running);
free(s);
return 0;
}