当前位置: 技术问答>linux和unix
线程中变量的作用范围
来源: 互联网 发布时间:2016-08-04
本文导语: 刚学到线程,有一段代码,其中关于变量a的作用范围不太理解,请高手指教 int a = 1; //全局变量 void *create(void *arg) { printf("new pthread ... n"); printf("a=%d n",a); return (void *)0; } in...
刚学到线程,有一段代码,其中关于变量a的作用范围不太理解,请高手指教
以上是2个疑问,再加一个:
如果在create函数中改变a的值,在main中打印有何影响?
谢谢!
int a = 1; //全局变量
void *create(void *arg)
{
printf("new pthread ... n");
printf("a=%d n",a);
return (void *)0;
}
int main(int argc,char *argv[])
{
pthread_t tidp;
int error;
int a=5; //这里的a是什么变量?赋值有何影响?
printf("a = %dn",a);
error=pthread_create(&tidp, NULL, create, NULL); //创建线程以后a有何影响?
以上是2个疑问,再加一个:
如果在create函数中改变a的值,在main中打印有何影响?
谢谢!
|
你可以这么理解,编译器倾向于在最小的scope内进行变量的解析,当当前的scope内没有变量定义时,就往更大的scope去解析。
在C语言中单独的函数,或者函数中的代码块{},都是scope。
楼主的例子中,create和main函数在解析a变量时,如果自己的函数内定义了a,就用自己定义的;如果自己没有定义,就到更大的scope中去找,就会找到全局的变量a。
在C语言中单独的函数,或者函数中的代码块{},都是scope。
楼主的例子中,create和main函数在解析a变量时,如果自己的函数内定义了a,就用自己定义的;如果自己没有定义,就到更大的scope中去找,就会找到全局的变量a。
|
对啊,变量的作用域是语言层面的,由编译器来保证。
而共享数据从根本上是因为线程共享同一个进程地址空间。
而共享数据从根本上是因为线程共享同一个进程地址空间。
|
#include
#include
int a = 1; //全局变量
void *create(void *arg)
{
printf("new pthread ... n");
printf("in son thread a=%d n",a); //打印的是全局变量
return (void *)0;
}
int main(int argc,char *argv[])
{
pthread_t tidp;
int error;
int a=5; //这里的a是什么变量?赋值有何影响? 局部变量
printf("in father thread a = %dn",a); //打印的是局部变量
error=pthread_create(&tidp, NULL, create, NULL);
//创建线程以后a有何影响?
pthread_join(tidp,NULL);
}
结论:
1.当局部变量与全局变量重名时,局部变量将屏蔽全局变量;
2.子线程共享父进程的全局变量,不共享栈上的变量。
|
如果你是想写很糟糕的代码,给全局变量和局部变量起同样的名字是个不错的选择,别人看着会比你自己看更加迷糊。