C + + std ::线程在执行时崩溃

问题描述:

我使用VS2012,我不能执行我的程序中没有崩溃的线程。应该指出,我的程序包含OpenGL和SOIL。C + + std ::线程在执行时崩溃

我只需拨打一个空白的线程,没有语句的功能,在我的功能之一,它立即崩溃:

void service(){ 

} 

/* Connect to server */ 
void connectToServer(){ 

    cout << "~CLIENT~\n" << endl; 

    std::thread serverConnect(service); 
} 

当程序调用connectToServer()它打破在调用语句std::thread serverConnect(service);通过以下调用-stack:

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; 
} 

只有当我在程序崩溃使用线程。

+0

您是否加入()线程? – 2014-08-29 00:21:49

销毁与joinable()线程关联的对象std::thread导致std::terminate()被调用。 §30.3.1.3[thread.thread.destr]:

~thread(); 

如果joinable(),来电std::terminate()。否则,没有 的影响。 [:隐式分离,或参与其析构joinable() 线程可能会导致难以调试 正确性(分离)或性能(加入)的bug遇到 只有当一个异常。因此程序员必须确保在线程仍然可以连接时绝不会执行析构函数。 - 注完]

有可能修复的众多:

  • 在堆上分配线程和有你的功能的智能指针返回线程对象
  • 还是有它返回一个std::thread(将serverConnect转换为返回值)
  • serverConnect移动到connectToServer() retu时不会被销毁的东西RNS(例如,一个全局变量)
  • join()线程返回
  • detach()线程之前返回

前的正确选择取决于您的具体使用情况。

+0

这对代码而言意味着什么?代码如何修复? – user2864740 2014-08-29 00:26:09

+1

这意味着你不能在堆栈上创建一个线程对象,然后立即让它超出范围。你需要将它保存在某个地方。 T.C。给了你一些可能的解决方案。 – 2014-08-29 00:42:43