【问题标题】:Monitoring thread termination in epoll loop在 epoll 循环中监视线程终止
【发布时间】:2021-12-20 10:11:34
【问题描述】:

在 linux 中,如何在线程终止时生成一个事件来打破 select / poll / epoll 循环?进程有pidfdSIGCHILD。线程有类似的东西吗?

编辑:这是直接监听线程终止事件。

【问题讨论】:

    标签: c++ c linux pthreads


    【解决方案1】:

    想到的最明显的解决方案是,被轮询/选择的文件描述符之一将是一个非常特殊的文件描述符,它是为特定目的而保留的。当您想“突破” select/poll/epoll 时,您只需对这个非常特殊的文件描述符进行适当的安排,使其可供读取,这将实现。

    在 select/poll/epoll 返回后,您将检查该文件描述符,就像您检查任何其他文件描述符一样,并根据该事件中应该发生的任何情况进行处理。所以这个问题剩下的唯一部分就是这会是一个什么样的非常特殊的文件描述符?

    好吧,既然您用linux 标记了您的问题,那么您有许多特定于 Linux 的选项可供选择。

    您可以关闭进程中的本机信号处理,以及create a signal file descriptor。然后,发送到进程的信号转换为信号文件描述符可供读取,并且从它读取,如手册页中所述,告诉您信号已被接收。

    event file descriptor 可能是另一种选择,这个更适合同一进程中的不同线程相互通知。

    事件和信号文件描述符都非常可轮询/可选择。并且总是有创建pipe()、选择/轮询管道的读取端以及写入管道的写入端以实现通知的老式方法。

    【讨论】:

    • 还有pidfd。
    • 我必须道歉。我在我的问题中忘记了“线程终止”这个词
    • 好吧,“线程终止”是什么意思?如果线程已终止,则根据定义,它不能处于任何选择/轮询循环中。在任何情况下,线程终止都不会随机发生。线程终止的唯一方法是从线程函数返回,或者抛出异常。这两种可能性都很容易控制,因此您可以在线程从其线程函数返回之前做任何您想做的事情,并将整个/事物包装在一个 try/catch 块中以捕获将终止线程的异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2013-01-24
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多