繁体   English   中英

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

[英]What is there to a thread beside a stack

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

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

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

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

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

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

POSIX XBD 3.396

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM