多线程环境中堆是如何管理的?
- 它是在线程之间共享还是每个线程都有其独立的堆?
- 如果两者都是可能的,那么推荐的方法是什么?
堆可以由互斥体共享和保护。这是最简单的解决方案,在大多数情况下都能很好地工作。
您可以为每个线程创建一个堆,但是您必须决定是允许从任何线程进行释放还是仅从进行分配的线程进行释放。无论哪种方式,它都会变得非常多毛。如果您有大量线程和大量分配,这可能是一个更具可扩展性的解决方案。
谈到pthreads
,
从手册页,
一个进程可以包含多个线程,所有线程都在执行同一个程序。这些线程共享相同的全局内存(数据和堆段),但每个线程都有自己的堆栈(自动变量)。
所有线程的堆都是相同的,但访问取决于用于访问分配内存的变量的范围。
void* thFn(void*)
{
char* c = new char[5];
//etc
delete[] c;
}
在这种情况下,内存将在堆上分配。但是c
对于每个 pthread 都是本地的。pthreads
如果允许(如果他们以某种方式获得地址),其他人可能会从该位置读取(检索正确的值,直到分配它的线程释放内存)。