gpt4 book ai didi

c - 禁用 __thread 支持

转载 作者:太空狗 更新时间:2023-10-29 11:10:01 27 4
gpt4 key购买 nike

我正在实现一个极其轻量级的 pthread 替换库。我想完全禁用 __thread 有几个原因。

  1. 这是浪费内存。如果我正在创建一千个与使用 __thread 声明变量的上下文无关的线程,它们仍将分配 程序仍将分配 1000*大小该数据字节,永远不要使用它。它与大规模并发模型的内 stub 本不兼容。如果我们需要只有 8K 堆栈的极其轻量级的纤程,那么只有 4K 的 TLS block 将是每个线程使用的内存的 50% 的开销。在某些情况下,TLS 开销会很大。
  2. TLS 是一个复杂的标准,我根本没有时间/资源来支持它。太贵了我个人认为该标准设计不当。它应该已经定义了链接器必须提供的标准函数,这样线程库就可以控制 TLS 分配发生的位置,并插入它需要的相关偏移量和地址。此外,标准 ELF 实现已被 pthread 感染,期望 pthread 大小的结构来计算偏移量,这使得它很难适应其他东西。
  3. 这只是一个糟糕的模式。它鼓励使用全局变量并创建具有静态函数/副作用的函数。如果我们正在创建易于分析的正确程序,这不是我们想要进入的领域。
  4. 如果我们真的需要“线程上下文”来实现一些在幕后跟踪线程状态的魔法(例如分配或取消跟踪),为什么不首先公开 TLS 用来理解该上下文的魔法?就我个人而言,我将直接使用 %fs 寄存器。由于显而易见的原因,这在库中是不可能的,但为什么它们一开始就应该是线程感知的呢?为什么不正确地设计它们,让它们首先在参数列表中获得所需的上下文相关数据?

我的问题很简单:禁用 __thread 支持并让 clang 在您不小心使用它时发出错误的最简单方法是什么?如果加载恰好需要 TLS 的动态库,我怎么会出错?

最佳答案

我相信最简单的方法是无条件地向您的 CFLAGS 添加类似的内容(如果您希望它是系统全局的,则可能来自 clang 的 gcc 规范文件的等价物):

-D__thread='^-^'

其中右侧可以是 C 程序中任何点在语法上无效(违反约束)的任何内容。

至于防止使用 TLS 加载库,您必须修补链接器和/或动态链接器以拒绝它们。如果您只是在谈论 dlopen,您的程序可以首先读取文件并解析 ELF header 以进行 TLS 重定位,然后拒绝该库(不将其传递给 dlopen)如果有的话。这甚至可以通过 LD_PRELOAD 包装器实现。

我同意您的看法,尤其是在其当前实现中,通常应避免使用 TLS,但请问您是否衡量过成本?我认为在设计用于使用它的系统上完全将其消除将相当困难,并且有很多更容易实现的目标来减少膨胀。你用的是哪个libc?如果它是 glibc,我很确定 glibc 有很多它在内部使用的 TLS 这些天......当然,如果你正在编写自己的线程实现,那将需要与标准库的其余部分进行大量交互,所以也许您已经在修补它...?


顺便说一句(后面是无耻的插件),我们有an extremely light-weight threads implementationmusl libc目前没有 TLS。我认为与另一个 libc 集成并不容易(而且我敢肯定,如果您正在编写自己的库,您会发现很难与 glibc 集成,尤其是 glibc 的动态链接器,它期望支持 TLS)但是如果您可以按原样使用整个库,它可能会满足您对特定项目的需求,或者您可以借用有用的代码(许可证是 MIT)。

关于c - 禁用 __thread 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12543234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com