有没有办法在线程创建/销毁时调用库线程本地初始化/清理?

2023-12-24

这个问题类似于如何在线程创建和退出时调用函数? https://stackoverflow.com/questions/42229612/how-to-call-a-function-on-a-threads-creation-and-exit但更具体。在另一个多进程共享内存项目中,我使用了以下组合:__属性__((构造函数)) https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Function-Attributes.html#constructor标记库初始化例程,每个线程的延迟初始化,以及鲁棒的未来 https://www.kernel.org/doc/Documentation/robust-futexes.txt确保共享内存中的资源不会泄漏,即使系统管理员选择 SIGKILL 使用它的进程之一也是如此。然而 API 中的 futexes 是way对于我当前的项目来说太重量级了,甚至是一些关于延迟初始化的指令也是我宁愿避免的。库 API 实际上将在多个进程的数百个线程中被调用数万亿次(每个 API 只有几百条指令。)

我猜答案是否定的,但由于我花了几个小时寻找但没有找到明确的答案,我想我应该在这里问它,那么下一个寻找简单答案的人将能够更快地找到它。

我的目标非常简单:在多个进程中异步创建线程时执行一些每线程初始化,并在异步销毁线程时在某个时刻稳健地执行一些清理。不一定要立即发生,但最终会发生。

一些涉及批判性思维的假设想法:从 __attribute__((constructor)) 标记的库 init 函数调用的假设 pthread_atclone() 将满足第一个条件。并且对 futex()es 进行了扩展,添加了一个类似于 semop 的操作,其中带有每个线程的 futex_adj 值,如果 do_exit() 中的值非零,则会导致为 futex“信号量”设置 FUTEX_OWNER_DIED,从而允许下次执行清理操作。 futex 被触及。


好吧,首先,您应该记录库用户不应以不显式释放属于您的库的资源的方式异步终止线程(关闭句柄,无论如何),TBH,在进程终止之前完全终止线程是一个馊主意。

当整个进程使用您的库时,检测整个进程是否被 SIGKILLed 会更加困难。我目前最好的猜测是,所有希望使用您的库的进程都必须首先登录,以便将它们的 pid 添加到容器中。使用在 lib 初始化时启动的线程,轮询已通过 Kill(pid,0) 消失的 pid,并进行适当的清理。这不是很令人满意,(我讨厌投票),但我没有看到任何不是非常混乱的替代方案:(

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在线程创建/销毁时调用库线程本地初始化/清理? 的相关文章

  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐