除了栈以外,线程还有什么?

8
在Linux进程中,每个线程都有自己的堆栈。除此之外,还有哪些是特定于每个线程的?我已经阅读了一些诸如文件分配表等内容...能否有人提供一个特定于线程的事物列表以及它们在内存中的排列方式。
其次,我注意到当我为一个线程分配堆栈(见下面的代码)时,线程函数中第一个变量的地址与我分配的堆栈地址(stackAddr)相差很多字节。我认为这是因为堆栈顶部是分配的堆栈内存的结束地址,因为局部变量地址和分配的堆栈地址的差值大约是堆栈大小(STACKSIZE)。换句话说,它看起来像是从底部向顶部增长。
pthread_attr_init( &attr[tid] );
stackAddr = malloc(STACKSIZE);
pthread_attr_setstack( &attr, stackAddr, STACKSIZE );

2
是的,栈向另一个方向增长,所以你自己回答了这个问题。 - Karoly Horvath
@yi_H,但我需要有人回答我的问题的第一部分 :-p! - MetallicPriest
3个回答

6

对于第一个问题,我可以想到以下几点:

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

其次,没错,在x86上堆栈向低地址增长。所以,如果你使用了pthread_attr_setstack函数,则该区域将从末尾开始使用。


5

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


0
在Linux上,如果应用程序员选择使用本地的clone() API而不是pthreads线程实现,那么他们可以对每个线程私有的资源和与其他线程共享的资源进行更多的控制。
这意味着无法给出一个明确的答案 - 线程特定的资源取决于创建线程时传递给clone()的标志。
还要注意,许多这些资源根本不存储在用户空间内存中 - 例如信号掩码保存在内核中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接