C# 如果被调用的非托管例程加入它所生成的线程,为什么我的托管进程会终止?
C++代码:C# 如果被调用的非托管例程加入它所生成的线程,为什么我的托管进程会终止?,c#,c++,multithreading,interop,C#,C++,Multithreading,Interop,C++代码: void callFromThread() { printf("Some Text"); } extern "C" { __declspec(dllexport) void DisplayHelloFromDLL() { printf("Hello from DLL !\n"); std::thread first(callFromThread); //first.join(); prin
void callFromThread()
{
printf("Some Text");
}
extern "C"
{
__declspec(dllexport) void DisplayHelloFromDLL()
{
printf("Hello from DLL !\n");
std::thread first(callFromThread);
//first.join();
printf("Test Test");
}
}
C#代码:
如果注释了first.join()
,我的程序将在非托管代码完成后立即终止
你能解释一下为什么C进程被终止吗?< /P>可能是因为C++代码中的一些错误导致进程崩溃。是否同时显示这两条消息?如果编写C++代码>主代码()/Cux>,执行<代码> DeStudioHeloFROMLDL,它崩溃了吗?如果将
DisplayHelloFromDLL
调用包装在中,请尝试。。。catch
,您能捕获异常吗?您的意思是当对join
的调用被注释掉时它崩溃了,还是当它没有被注释掉时它崩溃了。如果join
被注释掉,程序崩溃是完全正常的。在std::thread
超出作用域之前,必须调用join
或detach
,否则线程的析构函数将调用std::terminate
。我发现了原因,这是因为线程析构函数中出现异常:~thread()\u NOEXCEPT{//clean up if(joinable())\u std terminate()}当join被注释掉时,我该如何处理呢?就像我说的,你必须在线程超出作用域之前调用它,否则你的进程将被终止。
class Program
{
[DllImport("TestLib.dll")]
public static extern void DisplayHelloFromDLL();
static void Main(string[] args)
{
DisplayHelloFromDLL();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}