sha*_*n a 2 c++ opengl multithreading
我正在使用VS2012,我不能在我的程序中执行一个线程而不会崩溃.应该注意,我的程序包含OpenGL和SOIL.
我只是在我的一个函数中调用一个空白线程,一个没有语句的函数,它立即崩溃:
void service(){
}
/* Connect to server */
void connectToServer(){
cout << "~CLIENT~\n" << endl;
std::thread serverConnect(service);
}
Run Code Online (Sandbox Code Playgroud)
当程序调用connectToServer()
它时,它会在call语句中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
Run Code Online (Sandbox Code Playgroud)
该程序完美地运行,没有线程调用语句.另外,我的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;
}
Run Code Online (Sandbox Code Playgroud)
只有当我在我的程序中使用线程崩溃时才会这样.
销毁std::thread
与joinable()
线程相关联的对象会导致std::terminate()
被调用.§30.3.1.3[thread.thread.destr]:
Run Code Online (Sandbox Code Playgroud)~thread();
如果
joinable()
,打电话std::terminate()
.否则,没有任何影响.[ 注意:隐式分离或连接joinable()
其析构函数中的线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误.因此,程序员必须确保在线程仍可连接时永远不会执行析构函数.- 结束说明 ]
有许多可能的修复:
std::thread
(serverConnect
进入返回值)serverConnect
到的东西,不会被破坏时connectToServer()
的回报(例如,一个全局变量)join()
返回之前的线程detach()
返回之前的线程正确的选择取决于您的特定用例.