首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么线程共享堆空间?

为什么线程共享堆空间?
EN

Stack Overflow用户
提问于 2010-07-23 21:54:10
回答 7查看 18.9K关注 0票数 25

每个线程都有自己的堆栈,但它们共享一个公共堆。

每个人都清楚堆栈是用于局部/方法变量的&堆是用于实例/类变量的。

线程间共享堆的好处是什么?

有多个线程同时运行,因此共享内存可能会导致并发修改、互斥等开销问题。堆中的线程共享哪些内容。

为什么会这样呢?为什么不让每个线程也拥有自己的堆呢?有没有人能提供一个真实的例子,线程是如何利用共享内存的?

EN

回答 7

Stack Overflow用户

发布于 2010-07-25 08:15:21

因为否则的话,它们就是进程。这就是线程共享内存的全部思想。

票数 13
EN

Stack Overflow用户

发布于 2010-07-23 22:03:18

进程通常不共享堆空间。有一些API允许这样做,但默认情况下,进程是独立的

线程共享堆空间。

这就是“实用的想法”--使用内存的两种方式--共享和不共享。

票数 4
EN

Stack Overflow用户

发布于 2010-07-23 22:06:45

在许多语言/运行时中,堆栈(以及其他)用于保存函数/方法参数和变量。如果线程共享一个堆栈,事情会变得非常混乱。

代码语言:javascript
复制
void MyFunc(int a) // Stored on the stack
{
   int b; // Stored on the stack
}

当对'MyFunc‘的调用完成时,堆栈被弹出,a和b不再位于堆栈上。因为线程不共享堆栈,所以变量a和b不存在线程问题。

由于堆栈的性质(推送/弹出),它并不真正适合在函数调用之间保持“长期”状态或共享状态。如下所示:

代码语言:javascript
复制
int globalValue; // stored on the heap

void Foo() 
{
   int b = globalValue; // Gets the current value of globalValue

   globalValue = 10;
}

void Bar() // Stored on the stack
{
   int b = globalValue; // Gets the current value of globalValue

   globalValue = 20;
}


void main()
{
   globalValue = 0;
   Foo();
   // globalValue is now 10
   Bar();
   // globalValue is now 20
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3318750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档