【问题标题】:What is there to a thread beside a stack堆栈旁边的线程是什么
【发布时间】:2011-12-28 17:54:09
【问题描述】:

在 Linux 进程中,每个线程都有自己的堆栈。除此之外,每个线程还有什么是本地的。我已经阅读了诸如文件分配表之类的内容...有人可以向我提供特定于线程的内容列表以及它们在内存中的排列方式。

其次,我注意到当我将堆栈分配给线程时(参见下面的代码),线程函数中第一个变量的地址在我分配的堆栈地址之后的字节数(stackAddr)。我认为这是因为栈顶是分配的栈内存的结束地址,因为局部变量的地址和分配的栈的值的差值大约是栈的大小(STACKSIZE强>)。换句话说,它看起来像是从底部向顶部增长的。

pthread_attr_init( &attr[tid] );
stackAddr = malloc(STACKSIZE);
pthread_attr_setstack( &attr, stackAddr, STACKSIZE );

【问题讨论】:

  • 是的,堆栈向另一个方向增长,所以您回答了自己的问题。
  • @yi_H,但我需要有人回答我问题的第一部分:-p!

标签: c linux 64-bit x86 stack


【解决方案1】:

对于我能想到的第一个问题:

  • 线程 ID
  • 堆栈
  • 机器寄存器
  • 线程特定变量(由pthread_setspecific__thread 存储类设置的键/值对)
  • signal mask
  • 待处理信号集
  • 错误值

第二,是的,你是对的,在 x86 上,堆栈会增长到更低的地址。因此,如果您使用的是pthread_attr_setstack,则该区域将从最后开始使用。

【讨论】:

    【解决方案2】:

    POSIX XBD 3.396

    流程中的单一控制流。每个线程都有自己的线程 ID、调度优先级和策略、errno 值、特定于线程的键/值绑定以及支持控制流所需的系统资源。任何可以由线程确定地址的东西,包括但不限于静态变量、通过 malloc() 获得的存储、通过实现定义的函数获得的直接可寻址存储以及自动变量,都可以被同一进程中的所有线程访问。

    【讨论】:

      【解决方案3】:

      在 Linux 上,如果应用程序员选择使用本机 clone() API 而不是 pthreads 线程实现,则应用程序程序员可以很好地控制哪些资源是每个线程私有的,哪些资源与其他线程共享。

      p>

      这意味着不可能给出明确的答案 - 特定于线程的资源取决于创建线程时将哪些标志传递给 clone()

      还请注意,这些资源中的许多根本不存在于用户空间内存中 - 诸如信号掩码之类的东西保存在内核中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 2012-04-21
        • 2014-08-09
        • 1970-01-01
        • 2016-02-15
        • 2011-12-13
        相关资源
        最近更新 更多