【问题标题】:Which components of program state is shared across threads in a multi-threaded process?程序状态的哪些组件在多线程进程中跨线程共享?
【发布时间】:2010-12-15 05:42:42
【问题描述】:

以下哪些程序状态组件在多线程进程中跨线程共享?

  • 注册值
  • 堆内存
  • 全局变量
  • 堆栈内存

我的建议;只有全局变量,全局变量是分配在堆上的吗?所以堆内存和全局变量。它是否正确?

【问题讨论】:

  • 全局变量在程序的静态数据段中,而不是在堆中(如果我们谈论的是像 C 这样的经典编译语言)

标签: multithreading operating-system


【解决方案1】:

全局值和堆内存在多线程进程之间共享。寄存器值和堆栈内存是每个线程私有的。

【讨论】:

    【解决方案2】:

    堆栈:没有

    注册:没有

    堆:是的(如果你必须选择 y 或 n,真正的答案取决于)

    全局变量:是的

    【讨论】:

      【解决方案3】:

      这取决于语言和线程实现。例如,我认为即使是 C 语言也不允许您直接访问 CPU 寄存器,因此 pthreads 是否共享寄存器(作为记录,我相当肯定它不会)是相当有争议的。同样在 C 中,全局变量实际上分配在堆上,尽管它们可能在其他语言中。

      堆栈更复杂。在 C/pthreads 中,每个线程都有自己的堆栈,但在其他语言和线程模型中,情况可能要复杂得多,因为底层堆栈模型可能并不那么简单。

      【讨论】:

      • 你可以在 C 中使用内联汇编来访问寄存器,但它开始失去它的“便携式汇编”的名称。
      【解决方案4】:

      总是堆内存。

      全局变量取决于平台,通常是共享的。

      堆栈和寄存器一样是线程特定的。

      【讨论】:

      • @data_jepp 是的,在 linux 上共享。如果你想拥有线程局部的“全局”变量,你可以使用 pthread_* 函数分配线程局部存储。
      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多