gpt4 book ai didi

multithreading - POSIX的扩展,允许select()或等效的进程终止

转载 作者:行者123 更新时间:2023-12-03 13:00:07 26 4
gpt4 key购买 nike

在POSIX中,当特定的子进程终止时,无法通过select/poll进行通知。您可以得到的最接近的信号是SIGCHLD的信号处理程序,该信号处理程序与线程的交互作用较弱,可能根本无法使用解释语言,并且在任何子进程终止时将您唤醒。进入系统特定的扩展域后, signalfd 使得从主事件循环中获取SIGCHLD变得更加容易,但是并不能完全解决线程问题或解释语言问题,并且一旦任何子进程终止,它就会唤醒您。我不知道有任何其他人可以解决这个问题。

Unix的任何现代形式是否提供了一种机制,通过这种机制可以以100%不竞争和线程安全的方式将您从对selectpoll或类似(epoll,kqueue等)的调用中唤醒。子进程终止?

最佳答案

您是否控制或信任 child 的过程镜像,从而可以假定它们不摆弄继承的资源?

让每个 child 继承该 child 特定的pipe对的写入端。 parent 持有每一对的读端,并先验知道哪个fd与每个 child 相关。当 child 终止时,读取结束指示未决的EOF,对于选择/轮询/等将变为“可读”。即使在古老的Unix上,也可能在解释性语言中,即使您可能无法选择它们的 native SIGCHLD处理,这也应该起作用。

另外,您可以在现代系统中实现您想要的功能,并在父系统中指定一个线程来处理(或接受)所有SIGCHLD。然后,该线程将不得不像I/O或条件变量那样转换收割的PID into some other interthread communication。这并非微不足道,但可以做到无竞争且线程安全。 (如果您已经在混合线程和派生,我想您还是要采取一些预防措施。)

关于multithreading - POSIX的扩展,允许select()或等效的进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460760/

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