答案1
当产生新线程时,将为该线程的堆栈分配内存区域。线程局部变量的空间是从该区域分配的。严格来说,TLS 变量并不是堆栈的一部分,即它们不会被压入堆栈或从堆栈弹出,但它们存在于堆栈顶部的同一区域中。
该区域位于地址空间中的位置取决于很多因素。当使用 创建新线程时
pthread_create
,程序员可以传递一个指向内存的指针以用作线程的堆栈。该内存的位置取决于内存的分配方式。如果没有使用预先分配的内存,则使用mmap
withNULL
作为addr
参数来分配内存区域,这让内核决定内存映射到哪里。在 x86_64 上,以这种方式分配的内存位于堆栈和堆之间。每个线程都使用一个新的金丝雀值。查看答案这个问题。