我已经读过WinAPI中的TerminateThread()
使用起来很危险。
Linux中的pthread_kill()
是否也很危险?
修改:抱歉,我的意思是pthread_kill()
,而不是pthread_exit()
。
答案 0 :(得分:1)
引用汉弗莱·阿普尔比爵士的答案是“是的,不是”。
调用pthread_exit()本身并不危险,当你的线程退出其方法时会被隐式调用。但是,如果你手动调用它,会有一些“陷阱”。
如果您注意上述情况(例如,如果您在调用pthread_exit后小心不要引用任何有关该线程的信息),则可以安全地手动呼叫。但是,如果您使用C ++而不是C,我强烈建议您使用std :: thread类而不是手动执行。它更容易阅读,代码更少,并确保您不会破坏上述任何内容。
有关更多信息,请输入“man pthread_exit”,它基本上会告诉您以上内容。
答案 1 :(得分:0)
由于问题现已改变,我将写一个新答案。我的回答仍然是“是和否”,但原因已经改变。
pthread_kill有点危险,因为它分担了所有信号处理系统固有的潜在时间风险。此外,处理它时也很复杂,特别是你必须在线程中设置一个信号处理程序。但是有人可能会说它没有你提到的Windows功能那么危险。原因如下:Windows函数基本上会停止线程,可能会绕过正确的清理。它是最后的选择。另一方面,pthread_kill根本不会终止线程。它只是向线程发送信号,线程可以响应。
为了做到这一点,你需要在线程中注册你想要它处理的信号。如果你的目标是使用pthread_kill终止线程,你可以通过让你的信号处理程序设置一个线程可以访问的标志,并让线程检查标志并在设置时退出来使用它。你可能能够从信号处理程序调用pthread_exit(我从来没有尝试过),但由于信号是异步的,所以它让我感觉不好,而且你的线程不能保证仍在运行。我提到的标志选项解决了这个问题,前提是该标志不是线程的本地,允许信号处理程序设置它,即使目标线程已经退出。当然,如果你这样做,你根本不需要pthread_kill,因为你可以让主线程在适当的时候设置标志。
还有另一个选项可以阻止另一个线程--pthread_cancel方法。此方法将在目标线程上放置取消请求,如果线程已配置为可取消(您通常在pthread_create中执行此操作,但您也可以在事后执行此操作),则下一次线程到达时潜在的取消点(由pthread_testcancel指定,但也由许多系统例程自动处理,如IO调用),它将退出。这比Windows更安全,因为它不会猛烈地停止线程 - 它只会在明确定义的点停止。但它比Windows版本更多,因为你必须正确配置线程。
“posix threads”的维基百科页面描述了其中一些(但并不多),但它有一个非常好的“参见”和“参考”部分,它将为您提供更多细节。