gpt4 book ai didi

c++ - SIGSEGV 信号处理程序不是从辅助线程 c++ windows 调用的

转载 作者:行者123 更新时间:2023-12-05 07:55:18 24 4
gpt4 key购买 nike

在下面的简单测试代码中,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;
}

最佳答案

这里出现的问题是您正在使用来自 MSVCRT 的 signal,但您正在使用来自 Win32 native 的 CreateThread 创建线程。 _beginthreadexCreateThread 的 MSVCRT 包装器,它告诉运行时有关新线程的信息。

该链接引用了“旧代码的多线程支持 (Visual C++)”。这是因为 _beginthreadex 早于 C++11。当前的 C++ 运行时也支持 std::thread

关于c++ - SIGSEGV 信号处理程序不是从辅助线程 c++ windows 调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com