zoukankan      html  css  js  c++  java
  • 同一个进程中生成的不同线程的栈是互相可见的

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

  • 相关阅读:
    如何 Xcode 开发工具里安装一个空的项目末模板
    推荐完成项目要使用的常用工具
    仿照 QQ 的 cell 的左滑删除、置顶、标记未读效果
    API接口文档的撰写
    UI:动画
    UI:多线程 、用GCD创建线程
    UI:UICollectionView
    开发中的一些零碎知识点
    UI:数据库练习、滤镜效果
    UI:地图和定位
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2858347.html
Copyright © 2011-2022 走看看