线程创建 - 它是动态分配的吗?

时间:2017-06-14 17:03:07

标签: c multithreading memory-management pthreads

线程是否动态分配内存?

我一直在研究并对线程及其使用方式有一个公平的理解。我已经专门研究了线程的POSIX API。

我试图了解线程创建及其与简单malloc调用的区别。

我理解线程与父进程共享某些内存段,但它有自己的堆栈。

我非常感谢您可以阅读有关此主题的任何资源。谢谢!

2 个答案:

答案 0 :(得分:0)

线程创建和malloc()调用是完全不同的概念。 malloc()调用动态地从堆中分配所请求的字节内存块以供程序使用。

虽然线程可以被视为“轻量级过程”。线程是进程中的一个实体,每个进程至少有一个线程来帮助完成它的执行。进程的线程将共享进程虚拟地址和进程的所有资源。当您创建进程的新线程时,这些新线程将拥有自己的用户堆栈,它们将被独立调度以由调度程序执行。同样,对于并​​发运行的线程,它们的上下文将在抢占之前存储线程的状态,即所有寄存器的状态。

答案 1 :(得分:0)

  

线程是否动态分配内存?

不,没有那种。线程具有与它们唯一关联的内存 - 至少是堆栈 - 但是这样的内存不是线程本身。

  

我试图了解线程创建及其与简单malloc调用的区别。

新线程创建甚至不是内存分配的。这两者完全没有可比性。

具有直接OS支持(不是全部)的线程实现不太可能依赖于C库来获取其堆栈,内核数据结构或任何其他线程实现相关数据的内存。另一方面,那些没有OS支持的用户,比如Linux的旧“绿色”线程,更有可能通过C库分配内存。即使没有直接OS支持的线程实现也可以选择使用系统调用来获取所需的内存,就像malloc()本身必须这样做一样。在任何情况下,获得的内存本身不是线程。

另请注意,支持和不支持OS的线程系统之间的差异与线程API是正交的。例如,Linux的绿色线程和现在无处不在的内核支持的NPTL线程都实现了POSIX线程API。