2014-08-29 108 views
1

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

回答

4

銷燬與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