免费注册 查看新帖 |

Chinaunix

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

同一个进程中生成的不同线程的栈是互相可见的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-13 15:25 |只看该作者 |倒序浏览
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void* func1(void *p)
{
        int i = 5;
        printf("address of func1:i is %p\n",&i);
        sleep(4);
        printf("%d\n",*((int *)((unsigned int)(&i) - 1024 * 10244)));
}

void* func2(void *p)
{
        int i = 3;
        sleep(2);
        printf("address of func2:i is %p\n",&i);
        sleep(5);
}

int main()
{
        pthread_t id1,id2;
        pthread_create(&id1,NULL,func1,NULL);
        pthread_create(&id2,NULL,func2,NULL);
        sleep(10);
        exit(0);
}

func1竟然可以打印出func2中的变量i的值?

论坛徽章:
0
2 [报告]
发表于 2007-06-13 15:34 |只看该作者
void* func1(void *p)
{
        int i = 5;
        sleep(4);
        *((int *)((unsigned int)(&i) - 1024 * 10244)) = 4;
}

void* func2(void *p)
{
        int i = 3;
        printf("i = %d\n",i);
        sleep(7);
        printf("i = %d\n",i);
}

这个程序的结果是
i = 3
i = 4

论坛徽章:
0
3 [报告]
发表于 2007-06-13 15:36 |只看该作者
应该是吧

论坛徽章:
0
4 [报告]
发表于 2007-06-13 15:38 |只看该作者
记得《计算机系统-一个程序员的角度》讲过,虽然每个线程都有自己独立栈,但是因为它们都是在进程的上下文中运行的,而线程可以使用进程的所有资源,所以只要通过某种方法(如通过pthread_create函数中传递的void *)获得其他线程中对象的内存地址,线程也是可以访问其他线程的变量。。

论坛徽章:
0
5 [报告]
发表于 2007-06-13 17:08 |只看该作者
也就是说同一程序中,所有的线程用的是同一个逻辑地址空间,而且可以直接访问该地址.
那模型是这样的么?


-----------------
数据区
---------------
(低地址,堆)
      |
      V

     ^   
      |   线程3的栈
-----------
     ^
      |   线程2的栈
-----------
     ^
      |   线程1的栈
------------
(高地址)

论坛徽章:
0
6 [报告]
发表于 2007-06-13 17:21 |只看该作者
逻辑模型是这样的说,不过具体物理实现不一定如此。。

论坛徽章:
0
7 [报告]
发表于 2007-06-13 17:58 |只看该作者
是, 只要A线程能把指针传给B, B就能象A一样访问它的内存。

论坛徽章:
0
8 [报告]
发表于 2007-06-13 19:48 |只看该作者
果然!!
学习了

论坛徽章:
0
9 [报告]
发表于 2007-06-13 19:56 |只看该作者
原帖由 baohuaihuai 于 2007-6-13 17:08 发表
也就是说同一程序中,所有的线程用的是同一个逻辑地址空间,而且可以直接访问该地址.
那模型是这样的么?


-----------------
数据区
---------------
(低地址,堆)
      |
      V

     ^   
       ...


不知道是不是这样,但是肯定是这个模型

线程的栈都是用户态地址空间中的一部分。

论坛徽章:
0
10 [报告]
发表于 2007-06-14 09:24 |只看该作者
*((int *)((unsigned int)(&i) - 1024 * 10244))

这条厉害,居然知道具体的线程栈偏移
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP