gpt4 book ai didi

c - 线程共享地址空间,但不共享堆栈 : Contradicting?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:36 24 4
gpt4 key购买 nike

我知道线程共享地址空间,但不共享栈。这不是自相矛盾吗?为什么说它们共享地址空间是真的,而实际上它们并不共享它们的堆栈 - 堆栈是地址空间的一部分,不是吗?

我假设线程共享堆、数据和代码段而不是堆栈段。对我而言,它们都被视为进程地址空间。

有人可以澄清一下吗?谢谢!!

最佳答案

是的,线程有相同的地址空间但不共享堆栈。一个线程在内存中看到的任何内容,另一个线程也可以在同一地址看到,但每个线程的堆栈位于地址空间中的不同位置,因此它们各自独立调用其他函数而不会相互干扰。

以下面的程序为例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *foo(void *arg)
{
int *n = arg;
printf("in thread, arg=%p, value=%d, &n=%p\n", arg, *n, (void *)&n);
return NULL;
}

int main()
{
int x = 4;
printf("in main, x=%d, &x=%p\n", x, (void *)&x);
pthread_t tid;
pthread_create(&tid, NULL, foo, &x);
sleep(3);
pthread_join(tid, NULL);

return 0;
}

main 函数将位于主线程堆栈中的局部变量的地址传递给另一个线程。线程能够取消引用该指针并读取变量的值。

在我的系统上它输出如下:

in main, x=4, &x=0x7fff2142985c
in thread, arg=0x7fff2142985c, value=4, &n=0x7f6abaa90f08

这里可以看到主线程和子线程在main函数中看到的x的地址和值都是一样的。还可以看到,foo中的变量n的地址,在子线程的栈中,距离x<的地址很远main 中(相隔大约 637GB)。

这表明两个线程可以读取具有相同地址的相同内存,并且每个线程都有自己的堆栈。

关于c - 线程共享地址空间,但不共享堆栈 : Contradicting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54614745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com