需要帮助理解_set_security_error_handler()

时间:2010-03-05 17:25:07

标签: c# c++ multithreading

所以,我一直在读这篇文章:

http://msdn.microsoft.com/en-us/library/aa290051%28VS.71%29.aspx

我想定义我的自定义处理程序。但是,我不确定我是否理解了这些机制。在调用用户定义的函数(例如_set_security_error_handler()的参数)之后会发生什么?程序是否仍然在之后终止?如果是这种情况,是否有可能只终止当前线程(假设它不是应用程序的主线程).AFAIK,每个线程都有自己的堆栈,所以如果一个线程的堆栈被破坏,其余的应用程序不应受到影响。

最后,如果确实只能终止当前的执行线程,那么这样的行为会导致什么潜在的问题?

我正在尝试在我想要在C#代码中使用的非托管C ++ dll中完成所有这些。

1 个答案:

答案 0 :(得分:1)

文档说明:

“处理缓冲区溢出后,你应该终止线程或退出进程,因为线程的堆栈已损坏”

鉴于此声明,您似乎确实可以简单地杀死该线程。但是,你问这可能导致什么问题是正确的。 TerminateThread的文档讨论了杀死线程可能产生的以下问题:

  • 如果目标线程拥有临界区,则不会释放临界区。
  • 如果目标线程正在从堆中分配内存,则不会释放堆锁。
  • 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
  • 如果目标线程正在操作共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户

见这里:http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx

在这种情况下唯一要做的“安全”事情就是退出这个过程。