【发布时间】:2021-12-20 10:11:34
【问题描述】:
在 linux 中,如何在线程终止时生成一个事件来打破 select / poll / epoll 循环?进程有pidfd 和SIGCHILD。线程有类似的东西吗?
编辑:这是直接监听线程终止事件。
【问题讨论】:
在 linux 中,如何在线程终止时生成一个事件来打破 select / poll / epoll 循环?进程有pidfd 和SIGCHILD。线程有类似的东西吗?
编辑:这是直接监听线程终止事件。
【问题讨论】:
想到的最明显的解决方案是,被轮询/选择的文件描述符之一将是一个非常特殊的文件描述符,它是为特定目的而保留的。当您想“突破” select/poll/epoll 时,您只需对这个非常特殊的文件描述符进行适当的安排,使其可供读取,这将实现。
在 select/poll/epoll 返回后,您将检查该文件描述符,就像您检查任何其他文件描述符一样,并根据该事件中应该发生的任何情况进行处理。所以这个问题剩下的唯一部分就是这会是一个什么样的非常特殊的文件描述符?
好吧,既然您用linux 标记了您的问题,那么您有许多特定于 Linux 的选项可供选择。
您可以关闭进程中的本机信号处理,以及create a signal file descriptor。然后,发送到进程的信号转换为信号文件描述符可供读取,并且从它读取,如手册页中所述,告诉您信号已被接收。
event file descriptor 可能是另一种选择,这个更适合同一进程中的不同线程相互通知。
事件和信号文件描述符都非常可轮询/可选择。并且总是有创建pipe()、选择/轮询管道的读取端以及写入管道的写入端以实现通知的老式方法。
【讨论】: