c++ - pthread_kill() 与 pthread_cancel() 终止因 I/O 而阻塞的线程

标签 c++ c linux sockets pthreads

在我们的服务器代码中,我们使用 poll() 系统调用来监控客户端套接字。使用较大的超时值调用 poll()。因此调用 poll() 的线程因 I/O 而被阻塞。

根据流程,我们有一个场景,我们需要从另一个线程终止在 poll() 中阻塞的线程。我遇到过 pthread_kill() 和 pthread_cancel() 函数,它们可以终止因 I/O 而阻塞的目标线程。

通过阅读手册页,这两个函数似乎都能正常工作。互联网上很少有链接表明这两种功能使用起来都很危险。

有没有其他方法可以终止因 I/O 而阻塞的线程? 如果没有,建议使用这些功能中的哪一个。

最佳答案

一个简单而干净的选择是创建一个“信号”管道。也就是说,调用 pipe,获取“读取”端的文件描述符并将其添加到 poll 文件描述符列表(使用 POLLIN ).然后,每当你想解除阻塞正在等待 poll 的线程时,只需将一个字节写入管道的写端即可。接收到数据的管道将在阻塞的线程中以可读状态返回。您甚至可以通过改变写入字节的值来指定不同的“命令”。

(当然,您需要先从管道中读取字节,然后才能重新使用它。)

关于c++ - pthread_kill() 与 pthread_cancel() 终止因 I/O 而阻塞的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52391701/

相关文章:

未找到 C++ 命令行参数(文件)?

c - 为什么 NSError 需要双重间接? (指向指针的指针)

c - 我是否以定义的方式使用局部变量?

c++ - "Comment out pthreads"编译一个库

c - 为什么堆栈溢出导致段错误而不是 Linux 中的堆栈溢出?

android - 如何从 ubuntu 获取 android 电池电量?

-std=c99 可以阻止我的#includes 正常工作吗?

c++ - 让 Mbed Nucleo F401RE 与 LCD TFT HX8347 配合使用

c++ - 鼠标事件QT

c++ - 获取字体目录的平台独立方式?