c# - 需要帮助理解 _set_security_error_handler()

标签 c# c++ multithreading

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

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

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

最后,如果确实可以只终止当前执行的线程,这样的操作会导致哪些潜在问题?

我正在尝试在我想在我的 C# 代码中使用的非托管 C++ dll 中执行所有这些操作。

最佳答案

文档指出:

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

鉴于此声明,您似乎确实可以简单地终止线程。但是,您问这可能会导致什么问题是正确的。 TerminateThread 的文档讨论了终止线程可能引起的以下问题:

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

参见此处:http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx

在这种情况下唯一“安全”的做法是退出进程。

关于c# - 需要帮助理解 _set_security_error_handler(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2388625/

相关文章:

c++ - 什么是处理数千个单词列表的充分方法

java - 不同线程中填充的列表在调用者线程中显示为空 - Java

c - 多线程程序中的 printf 函数

c++ - 在带有 std::ref 的 std::thread 中使用地址清理调用 std::invoke(std::forward(...)) 时的奇怪行为

c# - 可以使子类仅通过静态属性实例化

c# - DocumentSaved 事件永远不会引发

c++ - 隐藏 constexpr 计算的最佳方法

C++ 函数定义和变量声明不匹配?

c# - 如何避免 .NET CF 3.5 和 CE 6 R3 中的严重错误

c# - 我如何创建一个程序,可以为不同的用户设置不同的用户界面细节和其他细节?