免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1962 | 回复: 6
打印 上一主题 下一主题

[Linux] 线程访问变量的本质 [复制链接]

论坛徽章:
1
天蝎座
日期:2013-10-05 22:53:35
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-02 19:07 |只看该作者 |倒序浏览
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int a=1;
void* create(void* arg)
{
printf("new thread\n");
printf("a=%d\n",a);
a++;
return (void*)0;
}
int main()
{
pthread_t tidp;
int error;
        a=5;
printf("in the main1:a=%d\n",a);
error=pthread_create(&tidp,NULL,create,NULL);
if(error)
{
printf("new thread is not created\n");
return -1;
}
sleep(1);
printf("in the main2:a=%d\n",a);
printf("new thread is created");
return 0;
}
为什么在线程里输出的a=1,在main里面都是a=5,这其中的本质谁能给讲的明白一点,就是关于线程和主函数访问变量的机制,如果把a=1去掉,线程为什么就会报错而不会访问到a=5呢?谢谢大家!

论坛徽章:
1
天蝎座
日期:2013-10-05 22:53:35
2 [报告]
发表于 2013-05-02 19:09 |只看该作者
如果把int a=1改为static int a=1呢?求解答

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-05-02 21:29 |只看该作者
楼主梦游了吗..

论坛徽章:
0
4 [报告]
发表于 2013-05-03 08:45 |只看该作者
变量的就近原则。

论坛徽章:
0
5 [报告]
发表于 2013-05-06 14:12 |只看该作者
int error;
        a=5;

??你确定这样能通过编译?如果是int error, a = 5;那么可以理解为就近原则。代码会在自己的那个作用域中找到相应的变量。准确的说main函数中的a是定义在main自己的栈内的。而最开始的int a;是在数据段中的,属于全局变量,因此线程可以访问。如果设置为static,线程可以访问,但是main中仍然会优先范围自己栈中的a。

论坛徽章:
1
天蝎座
日期:2013-10-05 22:53:35
6 [报告]
发表于 2013-06-10 21:59 |只看该作者
回复 5# gulang2004xy


    是这样的,谢谢楼上,也谢谢其他大神

论坛徽章:
0
7 [报告]
发表于 2013-06-11 00:33 |只看该作者
复习变量的 live scope
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP