堆可以由互斥锁共享和保护。这是最简单的解决方案,在大多数情况下效果很好。
您可以为每个线程创建一个堆,但是您必须决定是否允许从任何线程或仅从进行分配的线程发生解除分配。无论哪种方式,它都会变得非常毛茸茸。如果您有大量的线程和大量的分配,这可以是一个更具伸缩性的解决方案。
谈论pthreads
,
来自man page,
单个进程可以包含多个线程,所有线程都是
执行相同的程序。这些线程共享相同的全局内存
(数据和堆段),但每个线程都有自己的堆栈(自动堆栈)
变量)。
所有线程的堆都相同,但访问权限取决于用于访问已分配内存的变量范围。
void* thFn(void*)
{
char* c = new char[5];
//etc
delete[] c;
}
在这种情况下,将在堆上分配内存。但c
是每个pthread的本地。其他pthreads
可能从该位置读取(检索正确的值,直到由分配它的线程释放内存)如果允许(如果他们以某种方式获取地址)。