Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果被调用的非托管例程加入它所生成的线程,为什么我的托管进程会终止?_C#_C++_Multithreading_Interop - Fatal编程技术网

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

C++代码:

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();
    }
}