我正在使用VS2012,我无法在程序中执行线程而不会崩溃。应该注意,我的程序包含OpenGL和SOIL。
我只是在我的一个函数中调用一个空白线程,一个没有语句的函数,它会立即崩溃:
void service(){
}
/* Connect to server */
void connectToServer(){
cout << "~CLIENT~\n" << endl;
std::thread serverConnect(service);
}
当程序调用{{1}}时,它会在调用语句connectToServer()
处断开,并带有以下调用堆栈:
std::thread serverConnect(service);
该程序在没有线程调用语句的情况下完美运行。此外,我的VS环境运行像这样的简单示例线程程序没有问题:
msvcr110.dll!_crt_debugger_hook(int _Reserved) Line 60 C
msvcr110.dll!_call_reportfault(int nDbgHookCode, unsigned long dwExceptionCode, unsigned long dwExceptionFlags) Line 152 C++
msvcr110.dll!abort() Line 90 C
msvcr110.dll!terminate() Line 96 C++
IRC.exe!connectToServer() Line 449 C++
IRC.exe!handleKeypress(unsigned char key, int x, int y) Line 936 C++
glut32.dll!1000e054() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for glut32.dll]
glut32.dll!1000d5de() Unknown
user32.dll!753962fa() Unknown
user32.dll!75396d3a() Unknown
user32.dll!75396ce9() Unknown
user32.dll!753a0d27() Unknown
user32.dll!753a0d4d() Unknown
opengl32.dll!18f160fb() Unknown
user32.dll!753962fa() Unknown
user32.dll!75396d3a() Unknown
user32.dll!75396ce9() Unknown
user32.dll!753977c4() Unknown
user32.dll!753bd62a() Unknown
user32.dll!75397bca() Unknown
glut32.dll!10004970() Unknown
glut32.dll!10004a7a() Unknown
glut32.dll!1000491f() Unknown
IRC.exe!main(int argc, char * * argv) Line 1683 C++
IRC.exe!__tmainCRTStartup() Line 536 C
kernel32.dll!7551338a() Unknown
ntdll.dll!77049f72() Unknown
ntdll.dll!77049f45() Unknown
只有当我在我的程序中使用线程崩溃时才会这样。
答案 0 :(得分:5)
销毁与std::thread
线程关联的joinable()
对象会导致std::terminate()
被调用。 §30.3.1.3[thread.thread.destr]:
~thread();
如果
joinable()
,请致电std::terminate()
。否则,没有 效果。 [注意:隐式分离或加入joinable()
析构函数中的线程可能导致难以调试 正确性(用于分离)或性能(用于连接)遇到的错误 只有在引发异常时才会因此程序员必须确保这一点 当线程仍然可以连接时,析构函数永远不会被执行。 - 结束记录]
有许多可能的修复方法:
std::thread
(将serverConnect
移至返回值中)serverConnect
移动到connectToServer()
返回时不会被销毁的内容(例如,全局变量)join()
返回之前的帖子detach()
返回之前的帖子正确的选择取决于您的特定用例。