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