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

  • 相关阅读:
    定时器的应用---查询方式---让8个LED灯,左右各4个来回亮
    单片机实现60s定时器
    单片机不同晶振怎么计算延迟时间?
    573锁存器驱动8段数码管
    51单片机英文引脚等中文对照
    Java【小考】
    viso2010从mysql中导出ER图
    驱动继电器实验
    驱动蜂鸣器的实验
    驱动数码管的实验
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2858347.html
Copyright © 2011-2022 走看看