【发布时间】:2018-01-03 18:23:23
【问题描述】:
我知道这是一个非常具体的问题,对于高级程序员来说并不是很有趣,但我想知道线程函数的局部变量何时被分配,换句话说,在之后
pthread_create(&thread, &function, ...)
被执行,我可以说它们是否存在于内存中(考虑到调度程序可能还没有执行线程)?
我试图在 posix 库代码中搜索,但它不容易理解,我到达了用汇编编写的 clone 函数,但是我找不到系统调用服务例程 sys_clone 的代码来了解它到底是什么做。我在clone 代码中看到了线程函数的调用,但我认为这应该只发生在创建的线程中(当 pthread_create 终止时调度程序可能永远不会执行)而不是创建者。
【问题讨论】:
-
对于gcc,线程本地存储(TLS)分配在线程栈内存中,所以栈一分配就存在。请注意,pthread 属性中的堆栈大小必须足够大以包含 TLS。
-
@stark,线程函数的局部变量和 TLS 根本不是一回事。
-
很明显,函数的局部变量在函数入口处被分配到栈上,不管它是不是线程。我认为这不是 OP 的意思。
-
auto变量具有块作用域,因此您不必关心。在 pthread_create 返回时,它们可能存在,也可能不存在(可能不存在 - 线程存在但尚未开始执行)
标签: c multithreading posix