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


    #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的栈
    ------------
    (高地址)

  • 相关阅读:
    TestNg 2.套件测试
    JBPM工作流
    Spring 事务详解
    数据库事务隔离级别及传播行为
    Spring AspectJ基于注解的AOP实现
    Spring 通知(Advice)和顾问(Advisor)
    Spring 代理模式及AOP基本术语
    Spring之BeanFactory及Bean生命周期
    Spring 02多种注入方式和注解实现DI
    Spring 01基础
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2858347.html
Copyright © 2020-2023  润新知