这个问题类似于如何在线程创建和退出时调用函数? 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(使用前将#替换为@)