堆栈旁边的线程有什么用处

时间:2011-11-14 15:10:29

标签: c linux 64-bit x86 stack

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

POSIX XBD 3.396

  

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

答案 2 :(得分:0)

在Linux上,如果应用程序员选择使用本机clone() API而不是pthreads线程实现,则可以对每个线程专用的资源以及与其他线程共享的资源进行大量控制。

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

另请注意,其中许多资源根本不存在于用户空间内存中 - 例如信号掩码保留在内核中。