每个线程都有自己的堆栈,但它们共享一个公共堆。
每个人都清楚堆栈是用于局部/方法变量的&堆是用于实例/类变量的。
线程间共享堆的好处是什么?
有多个线程同时运行,因此共享内存可能会导致并发修改、互斥等开销问题。堆中的线程共享哪些内容。
为什么会这样呢?为什么不让每个线程也拥有自己的堆呢?有没有人能提供一个真实的例子,线程是如何利用共享内存的?
发布于 2010-07-25 08:15:21
因为否则的话,它们就是进程。这就是线程共享内存的全部思想。
发布于 2010-07-23 22:03:18
进程通常不共享堆空间。有一些API允许这样做,但默认情况下,进程是独立的
线程共享堆空间。
这就是“实用的想法”--使用内存的两种方式--共享和不共享。
发布于 2010-07-23 22:06:45
在许多语言/运行时中,堆栈(以及其他)用于保存函数/方法参数和变量。如果线程共享一个堆栈,事情会变得非常混乱。
void MyFunc(int a) // Stored on the stack
{
int b; // Stored on the stack
}
当对'MyFunc‘的调用完成时,堆栈被弹出,a和b不再位于堆栈上。因为线程不共享堆栈,所以变量a和b不存在线程问题。
由于堆栈的性质(推送/弹出),它并不真正适合在函数调用之间保持“长期”状态或共享状态。如下所示:
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
}
https://stackoverflow.com/questions/3318750
复制相似问题