【问题标题】:Thread Creation - is it dynamically allocated?线程创建 - 它是动态分配的吗?
【发布时间】:2017-11-16 22:59:47
【问题描述】:

线程是动态分配内存的吗?

我一直在研究并且对线程及其使用方式有相当了解。我专门研究了线程的 POSIX API。

我正在尝试了解线程创建以及它与简单的 malloc 调用有何不同。

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

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

【问题讨论】:

  • 你可以看到this关于pthread本地存储。 pthread 作为线程运行函数,因此每个线程都有自己的堆栈。
  • 线程不仅仅是内存。通常线程与操作系统数据相关联(如果它与操作系统任务相关联)。可以加入一个线程(产生它的返回值)。线程可以发出信号或取消。
  • 我不反对任何事情。我有点好奇是否在线程创建等中使用了 malloc。

标签: c multithreading memory-management pthreads


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    线程是动态分配内存的吗?

    不,没有那种东西。线程具有与其唯一关联的内存——至少是一个堆栈——但这样的内存不是线程本身。

    我正在尝试了解线程创建以及它与简单的 malloc 调用有何不同。

    新线程的创建甚至与内存分配不一样种类。两者完全没有可比性。

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      相关资源
      最近更新 更多