同一个进程中生成的不同线程的栈是互相可见的

原文链接: http://www.cnblogs.com/GODYCA/archive/2013/01/13/2858347.html

#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的值?

记得《计算机系统-一个程序员的角度》讲过,虽然每个线程都有自己独立栈,但是因为它们都是在进程的上下文中运行的,而线程可以使用进程的所有资源,所以 只要通过某种方法(如通过pthread_create函数中传递的void *)获得其他线程中对象的内存地址,线程也是可以访问其他线程的变量。。

也就是说同一程序中,所有的线程用的是同一个逻辑地址空间,而且可以直接访问该地址.
那模型是这样的么?


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

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

转载于:https://www.cnblogs.com/GODYCA/archive/2013/01/13/2858347.html

猜你喜欢

转载自blog.csdn.net/weixin_30416871/article/details/94787411