2 回答
TA贡献1786条经验 获得超11个赞
由于问题现已更改,因此我将写一个新答案。我的回答仍然是“是和不是”,但原因已经改变。
pthread_kill有点危险,因为它承担了所有信号处理系统固有的潜在时序风险。此外,处理它还很复杂,特别是您必须在线程中设置一个信号处理程序。但是,有人可能会说它没有您提到的Windows功能危险。原因如下:
Windows函数实质上停止了线程,可能绕过了适当的清理。它旨在作为最后的选择。另一方面,pthread_kill根本不终止线程。它只是向线程可以响应的线程发送信号。
为了执行此操作,您需要在线程中注册要处理的信号。如果您的目标是使用pthread_kill终止线程,则可以通过让信号处理程序设置一个线程可以访问的标志,并让线程检查该标志并在设置该标志时退出该标志来使用此功能。您也许可以从信号处理程序中调用pthread_exit(我从没有尝试过),但是由于信号是异步传入的,因此并不能保证您的线程仍在运行,这对我来说是一个坏主意。我提到的标志选项可以解决此问题,前提是标志不是线程本地的,即使目标线程已经退出,也允许信号处理程序对其进行设置。当然,如果您这样做,则根本不需要pthread_kill,
还有一个用于停止另一个线程的选项-pthread_cancel方法。此方法将在目标线程上发出取消请求,并且,如果该线程已配置为可取消(通常在pthread_create中执行此操作,但也可以在事后执行),然后在线程下次到达潜在的取消点(由pthread_testcancel指定,但也由许多系统例程(例如IO调用)自动处理),它将退出。这也比Windows更为安全,因为它不会猛烈地停止线程-它只会在定义明确的点停止。但这要比Windows版本更多,因为您必须正确配置线程。
Wikipedia页面上的“ posix线程”描述了其中一些(但不多),但是它有一个很好的“另请参阅”和“参考”部分,将为您提供更多详细信息。
- 2 回答
- 0 关注
- 578 浏览
添加回答
举报