Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
SigSeSv信号处理程序不从二级线程C++窗口调用_C++_Multithreading - Fatal编程技术网

SigSeSv信号处理程序不从二级线程C++窗口调用

SigSeSv信号处理程序不从二级线程C++窗口调用,c++,multithreading,C++,Multithreading,在下面的简单测试代码中,SIGSEGV信号处理程序不是从辅助线程调用的,尽管如果崩溃发生在主线程中,则会调用它。在这两种情况下都会调用SIGABRT信号的处理程序。 谁能解释一下我做错了什么或为什么 #include <iostream> #include <Windows.h> #include <signal.h> void signal_handler(int sig) { const char* name = NULL; switc

在下面的简单测试代码中,SIGSEGV信号处理程序不是从辅助线程调用的,尽管如果崩溃发生在主线程中,则会调用它。在这两种情况下都会调用SIGABRT信号的处理程序。 谁能解释一下我做错了什么或为什么

#include <iostream>
#include <Windows.h>
#include <signal.h>

void signal_handler(int sig) 
{
    const char* name = NULL;
    switch( sig )
    {
        case SIGABRT: name = "SIGABRT";  break;
        case SIGSEGV: name = "SIGSEGV";  break;
    }
    std::cout << "Handler: Caught signal: " << name << std::endl;   
}

void install_signal_handlers()
{
    signal(SIGABRT, signal_handler);
    signal(SIGSEGV, signal_handler); 
    std::cout << "Signal handlers are installed" << std::endl;
}

void crash()
{
    //abort();
    //raise(SIGSEGV);
    try
    {
        int* ptr = NULL;
        *ptr = 2;
        std::cout << *ptr << std::endl;
    }
    catch (...) 
    {
        std::cout << "Caught exception: " << std::endl; 
    }   
} 

DWORD WINAPI thread(LPVOID lpParameter)
{
    //install_signal_handlers();    
    crash();

    return 0;
}

int main()
{
    install_signal_handlers(); 
    //crash();

    DWORD myThreadID;
    HANDLE myHandle = CreateThread(0, 0, thread, 0, 0, &myThreadID);

    if (myHandle == NULL) 
    {
        std::cout << "Failed to create thread" << std::endl; 
    }

    WaitForSingleObject(myHandle, INFINITE);
    CloseHandle(myHandle);

    return 0;
}

看起来Windows不符合POSIX,是吗?一些可能无关的注意事项:写入空指针不一定会导致崩溃,很可能会,但未定义行为的问题是,该行为只是未定义的,任何事情都可能发生。它也不会导致C++异常被抛出。至于你的问题,什么次要线程?在POSIX中,如果在Windows中是相同的,我不知道哪个线程会收到信号,这是没有保证的。谢谢,但我的问题有点不同。如果取消注释main函数中的第2行并调用crash函数,则信号处理程序将始终使用信号SIGSEGV进行调用。但在函数“thread”中,调用相同崩溃函数的非主线程不会调用信号处理程序。重新写入空指针并不一定会导致崩溃——我尝试直接提高sesigsegv以确保问题仍然存在。