簡體   English   中英

C++ - std::thread 在執行時崩潰

[英]C++ - std::thread crashes upon execution

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

只有當我在我的程序中使用線程時它才會崩潰。

銷毀與joinable()線程關聯的std::thread對象會導致調用std::terminate() §30.3.1.3 [thread.thread.destr]:

 ~thread();

如果joinable() ,則調用std::terminate() 否則,沒有任何影響。 [注意:在其析構函數中隱式分離或加入joinable()線程可能導致難以調試正確性(對於分離)或僅在引發異常時遇到性能(對於連接)錯誤。 因此,程序員必須確保在線程仍可連接時永遠不會執行析構函數。 尾注]

有多種可能的修復方法:

  • 在堆上分配線程並讓您的函數返回一個指向線程對象的智能指針
  • 或者讓它返回一個std::thread (將serverConnect移動到返回值中)
  • serverConnect移動到當connectToServer()返回時不會被破壞的東西中(例如,全局變量)
  • 在返回之前join()線程
  • 在返回之前detach()線程

正確的選擇取決於您的特定用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM