我正在使用 VS2012,我无法在程序中执行线程而不崩溃。应该注意的是,我的程序包含 OpenGL 和 SOIL。
我只是在我的一个函数中调用一个空白线程,一个没有语句的函数,它立即崩溃:
void service(){
}
/* Connect to server */
void connectToServer(){
cout << "~CLIENT~\n" << endl;
std::thread serverConnect(service);
}
当程序调用
connectToServer()
时,它会在具有以下调用堆栈的调用语句 std::thread serverConnect(service);
处中断: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
该程序在没有线程调用语句的情况下完美运行。此外,我的 VS 环境运行这样的简单示例线程程序没有问题:
#include <iostream>
#include <thread>
using namespace std;
//This function will be called from a thread
void call_from_thread() {
std::cout << "Hello, World" << std::endl;
}
int main() {
//Launch a thread
thread t1(call_from_thread);
system("pause");
return 0;
}
只有当我在我的程序中使用线程时它才会崩溃。
最佳答案
销毁与 std::thread
线程关联的 joinable()
对象会导致调用 std::terminate()
。 §30.3.1.3 [thread.thread.destr]:
有多种可能的修复方法:
std::thread
(将serverConnect
移动到返回值中)serverConnect
移动到 connectToServer()
返回时不会被破坏的地方(例如,全局变量) join()
detach()
正确的选择取决于您的特定用例。
关于C++ - std::thread 在执行时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25559918/