在C代码中调用TerminateThread后,在C#代码中检测到FatalExecutionEngineError
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C代码中调用TerminateThread后,在C#代码中检测到FatalExecutionEngineError,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1940字,纯文字阅读大概需要3分钟。
内容图文
![在C代码中调用TerminateThread后,在C#代码中检测到FatalExecutionEngineError](/upload/InfoBanner/zyjiaocheng/793/e8230cfd44aa490ea1287a5d9931b6c8.jpg)
如果我从C代码调用TerminateThread,那么稍后我将获得FatalExecutionEngineError MDA.当我对字符串(即concat)执行不同的操作时,这种错误通常会发生.下面列出的代码只显示了如何重现它.
为什么会这样?我该如何修复它仍然使用TerminateThread?
谢谢
错误是:
FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error.
The address of the error was at 0x7880bb35, on thread 0x18f0.
The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code.
Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
C代码:
Module.cpp:
#include "ThreadModule.h"
using namespace ThreadModule;
DWORD WINAPI workThread(LPVOID lpParam) {
while(1) {
System::Threading::Thread::Sleep(5);
printf(".");
}
return 0;
}
bool Module::StartThread() {
handle = CreateThread(
NULL,
0,
workThread,
NULL,
0,
&threadIdInput);
return true;
}
bool Module::StopThread() {
TerminateThread(handle, 0);
handle = NULL;
return true;
}
C#代码:
static void Main(string[] args)
{
Module module = new Module();
module.StartThread();
string s = "";
for (int i = 0; i < 10000; i++)
{
s += i.ToString();
}
module.StopThread();
s = "";
for (int i = 0; i < 10000; i++)
{
s += i.ToString(); //After ~250 iteration get exception
}
Console.WriteLine("Completed!!");
}
解决方法:
System::Threading::Thread::Sleep(5);
您启动的线程是运行托管代码,而不是本机C代码.很明显,您使用/ clr选项编译了这个,因此您可以编写C/C++LI代码.这是一个问题,CLR知道那个线程.必然如此,它需要在运行垃圾收集器时查看线程的堆栈以查找托管对象引用.
这使得使用TerminateThread()杀死线程是一个问题,比现在更多,它是一个危险的winapi函数,不执行清理. CLR在扫描该死线程的堆栈时会崩溃.
CLR可以使用Thread :: Abort()执行安全的线程中止.这样做仍然不是一个好主意,但至少你不会让你的程序在这方面做得很糟糕.请注意,当线程运行本机代码时,Abort()将不起作用.当然最好完全注意中止线程是一个好主意的想法.
要求线程很好地停止的一个显而易见的地方是while(1)语句.
内容总结
以上是互联网集市为您收集整理的在C代码中调用TerminateThread后,在C#代码中检测到FatalExecutionEngineError全部内容,希望文章能够帮你解决在C代码中调用TerminateThread后,在C#代码中检测到FatalExecutionEngineError所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。