【问题标题】:Executing pthread "pre init" function on thread start在线程启动时执行 pthread“pre init”函数
【发布时间】:2023-04-10 00:33:01
【问题描述】:

我正在使用一个启动 pthreads 的外部 linux 库。

当一个新的 pthread 在线程“main”函数启动之前从线程的上下文启动时,我有什么方法可以设置一个调用提供的函数的触发器? (例如安装信号处理程序或其他)

【问题讨论】:

  • 线程没有自己的信号处理程序,所以我怀疑你想做的事情是基于误解。请澄清你真正需要什么。可能有更好的方法。
  • @R..:新的 linux 进程(包括 linux 上的线程)是否与其父进程共享其信号处理程序表是克隆系统调用的一个选项。然而,无论哪种方式,如果存在这样的信号,这不会排除在新的 pthread 启动时发送信号(到共享信号处理程序)。我想要做的是在线程开始执行一些每个线程初始化时执行一个函数 - 但由于它是一个外部库,我无法修改 thread_main。 (类似于 pthread_key_create 允许您在线程退出时执行函数)
  • 请在这些新线程中具体说明什么。可能有另一种方法可以实现您所需要的,但是当您要求一种方法来实现不可能的机制而不是要求一种方法来实现效果.
  • @R..:好的,我需要调用具有 thread_local 存储持续时间的非 POD 变量的构造函数,因为 gcc 尚未实现非 POD 线程局部变量。当前的解决方法是在第一次使用时调用构造函数,然后使用 pthread_key_create 析构函数功能来销毁它们(就像 boost::thread_local_ptr 所做的那样),但是这种延迟初始化会导致第一次使用时的延迟是不可取的,我宁愿让它们提前初始化时间。开心吗?
  • 这些 thread_local 对象是否在您作为回调提供给库代码的代码中使用?我打算建议你现在正在做的那种惰性初始化;我不认为有更好的方法。请记住,非 POD thread_local vars 有很多基础程序(所有 thread_local vars 都有,但运行时成本通常被认为比内存浪费更重要),因为它们的构造函数可以在任何线程中运行,甚至与代码完全无关的线程这将使用对象。

标签: c linux pthreads


【解决方案1】:

没有标准的 API 可以满足您的要求。总是有复杂而脆弱的选择;例如,您可以构建一个过滤器 Shared Lib(参见 ld 手册页中的选项 --filter=name )来拦截 pthread_create,并围绕调用者为线程创建自己的包装函数。

【讨论】:

  • 其他(复杂和脆弱的)替代方案是什么?
  • 拦截系统调用,编写内核驱动,编写程序对外部linux库进行二进制编辑。
  • GDB 在新线程启动时打印出一些东西,我想知道它使用什么机制。
  • ptrace。你不想在生产中打开它。
猜你喜欢
  • 2016-10-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2017-12-04
  • 2018-11-08
  • 1970-01-01
相关资源
最近更新 更多