C++ C++;-执行时线程崩溃
我正在使用VS2012,如果程序没有崩溃,我无法在程序中执行线程。应该注意的是,我的程序包含OpenGL和SOIL 我只需在我的一个函数中调用一个空白线程(一个没有语句的函数),它就会立即崩溃: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
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();