C++ C++;-执行时线程崩溃

C++ C++;-执行时线程崩溃,c++,multithreading,opengl,C++,Multithreading,Opengl,我正在使用VS2012,如果程序没有崩溃,我无法在程序中执行线程。应该注意的是,我的程序包含OpenGL和SOIL 我只需在我的一个函数中调用一个空白线程(一个没有语句的函数),它就会立即崩溃: void service(){ } /* Connect to server */ void connectToServer(){ cout << "~CLIENT~\n" << endl; std::thread serverConnect(servic

我正在使用VS2012,如果程序没有崩溃,我无法在程序中执行线程。应该注意的是,我的程序包含OpenGL和SOIL

我只需在我的一个函数中调用一个空白线程(一个没有语句的函数),它就会立即崩溃:

void service(){

}

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

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

    std::thread serverConnect(service);
}
该程序在没有线程调用语句的情况下运行良好。此外,我的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;
}
#包括
#包括
使用名称空间std;
//此函数将从线程调用
来自线程()的无效调用{

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

如果
joinable()
,则调用
std::terminate()
。否则,没有 效果。[注意:隐式分离或连接
joinable()
其析构函数中的线程可能导致难以调试 遇到正确性(用于分离)或性能(用于连接)错误 仅当引发异常时。因此程序员必须确保 当线程仍然可连接时,析构函数永远不会执行。 -[完注]

有多种可能的修复方法:

  • 在堆上分配线程,并让函数返回指向线程对象的智能指针
  • 或者让它返回一个
    std::thread
    (将
    serverConnect
    移动到返回值中)
  • serverConnect
    移动到当
    connectToServer()
    返回时不会被破坏的位置(例如,一个全局变量)
  • join()
  • detach()

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

您是否
join()
线程?这对代码来说意味着什么,以及如何修复代码?这意味着您不能在堆栈上创建线程对象,然后立即使其超出范围。您需要将其保存在某个位置。t.C.为您提供了许多可能的解决方案。
~thread();