C ++ - std :: thread在执行时崩溃

时间:2014-08-29 00:21:15

标签: c++ multithreading opengl

我正在使用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

只有当我在我的程序中使用线程崩溃时才会这样。

1 个答案:

答案 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()返回之前的帖子

正确的选择取决于您的特定用例。