队列用户APC - 抛出异常崩溃,可能是 mingw 错误
QueueUserAPC - throwing exception crashes, possible mingw bug
已解决:我从mingw 4.6.2升级到4.7.0,它运行良好,猜猜这只是一个错误
我开始对如何正确终止多线程应用程序进行一些研究,我发现了关于如何使用QueueUserAPC
向其他线程发出终止信号的 2 篇帖子(第一、第二篇)。
我想我应该试一试,当我从 APCProc 抛出异常时,应用程序不断崩溃。
法典:
#include <stdio.h>
#include <windows.h>
class ExitException
{
public:
char *desc;
DWORD exit_code;
ExitException(char *desc,int exit_code): desc(desc), exit_code(exit_code)
{}
};
//I use this class to check if objects are deconstructed upon termination
class Test
{
public:
char *s;
Test(char *s): s(s)
{
printf("%s ctorn",s);
}
~Test()
{
printf("%s dctorn",s);
}
};
DWORD CALLBACK ThreadProc(void *useless)
{
try
{
Test t("thread_test");
SleepEx(INFINITE,true);
return 0;
}
catch (ExitException &e)
{
printf("Thread exitsn%s %lu",e.desc,e.exit_code);
return e.exit_code;
}
}
void CALLBACK exit_apc_proc(ULONG_PTR param)
{
puts("In APCProc");
ExitException e("Application exit signal!",1);
throw e;
return;
}
int main()
{
HANDLE thread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
Sleep(1000);
QueueUserAPC(exit_apc_proc,thread,0);
WaitForSingleObject(thread,INFINITE);
puts("main: bye");
return 0;
}
我的问题是为什么会发生这种情况?
我使用 mingw 进行编译,我的操作系统是 64 位。
这是原因吗?我读到您不应该从 32 位应用程序调用 64 位进程中运行的线程QueueApcProc
,反之亦然,但情况并非如此。
编辑:我用Visual studio的c ++编译器2010编译了这个,它完美地工作,这可能是gcc/mingw中的一个错误?
我可以用VS2005重现同样的事情。问题是编译器优化了catch
。为什么?因为根据C++标准,如果extern "C"
函数异常退出会发生什么,这是未定义的。因此,编译器假定SleepEx
(extern "C"
)永远不会抛出。在内联Test::Test
和Test::~Test
后,它看到printf
也不会抛出,因此如果此块中的某些内容通过异常退出
Test t("thread_test");
SleepEx(INFINITE,true);
return 0;
行为未定义!
在 MSVC 中,代码不适用于发布版本中的/EHsc
开关,但适用于 /EHa
或 /EHs
,这告诉它假设 C 函数可能会抛出。也许海湾合作委员会也有类似的标志。
相关文章:
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- SFML 库 - 在 MinGW 构建期间未找到错误
- CMAKE Mingw-W64:尝试构建时出现奇怪的错误
- 是 VS 代码 MinGW 与 Win32 中未定义的错误
- CodeBlocks,C++,mingw-w64编译器,Windows 10,错误:对`DAQmxCreateTask&
- dev在试图从dev c++mingw 4.8.1中的文件读取时接收分段错误
- C++线程错误:没有名为"类型"MINGW 的类型
- 使用 MinGW 构建 ASSIMP 会导致文件太大错误
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- 代码::块 (MinGW) #include <priority_queue>上的编译错误
- VS2017 的输出错误,但 mingw 有效
- 尝试在Visual Studio工作时使用CLION的Boost 1.69.0,但给出了奇怪的MINGW错误
- MinGW 错误关于 TITLEBARINFO 未声明
- MINGW错误:“线程”不是“ STD”的成员
- C++好友模板函数-minGW错误,但不是VS2015
- 队列用户APC - 抛出异常崩溃,可能是 mingw 错误
- wxWidgets 编译 MinGW - 错误 1 和错误 2
- C++ Qt MingW 错误的重新定位0xc rdata 部分中的地址
- MinGW 错误:'min'不是 'std' 的成员