【发布时间】:2010-09-17 06:05:53
【问题描述】:
我有一个线程在后台运行,它以阻塞方式从输入设备读取事件,现在当我退出应用程序时,我想正确清理线程,但我不能只运行 pthread_join()因为阻塞 IO,线程永远不会退出。
我该如何正确解决这种情况?我应该发送 pthread_kill(theard, SIGIO) 还是 pthread_kill(theard, SIGALRM) 来打破块?这是否是正确的信号?或者有没有其他方法可以解决这种情况,让那个子线程退出阻塞读取?
目前有点困惑,因为我的谷歌搜索都没有找到解决方案。
这是在 Linux 上使用 pthreads。
编辑:我玩了一下 SIGIO 和 SIGALRM,当我不安装信号处理程序时,它们会破坏阻塞 IO,但会在控制台上显示消息(“I/O 可能”)但是当我安装时一个信号处理程序,为了避免该消息,它们不再破坏阻塞 IO,因此线程不会终止。所以我有点回到第一步。
【问题讨论】:
-
那里讨论了类似的问题和可能的解决方案:File Descriptors And Multithreaded Programs
-
这篇文章给了我我一直在寻找的东西——shutdown(fd, SHUT_RDWR);。谢谢。
-
qqq好像有正确答案,可惜票数很少。
pthread_cancel是您问题的解决方案。 -
只要线程保持阻塞状态,它就不会造成任何伤害。问题是线程是否在您关闭时唤醒。因此,解决方法是在停止线程执行任何操作else的行之后放置一些代码(如果正在进行关闭)。
标签: c linux multithreading pthreads