是用pthread_kill()危险吗?

时间:2018-05-07 13:35:47

标签: c linux multithreading winapi pthreads

我已经读过WinAPI中的TerminateThread()使用起来很危险。

Linux中的pthread_kill()是否也很危险?

修改:抱歉,我的意思是pthread_kill(),而不是pthread_exit()

2 个答案:

答案 0 :(得分:1)

引用汉弗莱·阿普尔比爵士的答案是“是的,不是”。

调用pthread_exit()本身并不危险,当你的线程退出其方法时会被隐式调用。但是,如果你手动调用它,会有一些“陷阱”。

  1. 调用此方法时将调用所有清理处理程序。因此,如果您调用此方法,然后访问清理处理程序已清理的一些内存,则会出现内存错误。
  2. 类似地,在调用此函数后,该线程的任何本地和线程局部变量都将变为无效。因此,如果对它们进行引用,则可能会出现内存错误。
  3. 如果已经为线程调用(隐式或显式),则再次调用它具有未定义的行为,并且
  4. 如果这是您流程中的最后一个帖子,则会导致该流程退出。
  5. 如果您注意上述情况(例如,如果您在调用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”的维基百科页面描述了其中一些(但并不多),但它有一个非常好的“参见”和“参考”部分,它将为您提供更多细节。