【问题标题】:When are thread function local variables allocated with Posix?Posix 何时分配线程函数局部变量?
【发布时间】: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


【解决方案1】:

换句话说,在

pthread_create(&thread, &function, ...)

被执行,我能说它们存在于内存中还是不存在(考虑 调度器可能还没有执行线程)?

POSIX 没有让您有任何理由相信在创建的线程中对函数 function() 的初始调用的局部变量将在 pthread_create() 返回时分配。它们可能是也可能不是,事实上,答案甚至可能没有很好的定义,因为不同的线程不一定对机器状态有一致的看法。

相对于该线程中调用的任何其他函数的局部变量,线程启动函数的局部变量没有特殊意义。而且,虽然pthread_create()在新线程创建之前不会成功返回,但这与是否进入start函数是一个单独的问题,更不用说它的局部变量是否已经分配了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多