【发布时间】:2019-02-22 19:01:23
【问题描述】:
在我们的服务器代码中,我们使用 poll() 系统调用来监控客户端套接字。 poll() 以较大的超时值调用。所以调用 poll() 的线程被 I/O 阻塞。
根据流程,我们有一个场景,我们需要从另一个线程终止在 poll() 中阻塞的线程。我遇到过 pthread_kill() 和 pthread_cancel() 函数,它们可以终止为 I/O 阻塞的目标线程。
通过阅读手册页,这两个功能似乎都可以正常工作。互联网上很少有链接表明这两个功能使用起来很危险。
有没有其他方法可以终止因 I/O 阻塞的线程? 如果不是,建议使用这些功能中的哪一个。
【问题讨论】:
-
杀死一个线程是有风险的。见this question。
-
更频繁地从
poll唤醒并测试由另一个线程设置的终止标志。如果标志说终止,则终止。否则循环并再次poll,直到你达到更广泛的退出条件。线程杀死应该是最后的手段。因为它会给你留下一个不稳定的程序 -
既然你有这个标记的linux,一种方法是在你轮询的那些中包含一个
eventfd()描述符,并在轮询线程应该退出时发出信号(并让该线程在fd 变得可读)。 -
@R.. 杀死威胁通常被理解为导致其执行立即且不可撤销地停止。一个特定的线程 API 是否允许它是另一个问题。
-
@R.. 你说得对。尽管如此,杀死一个线程是有风险的,而且仍然有 像杀死一个线程这样的事情。此信息仍然与 OP 相关,因为这是他们正在尝试做的事情,无论使用他们选择的 API 做这件事是不可能的。
标签: c++ c linux sockets pthreads