我有以下三个文件:
MyClass.h
class MyClass {
private:
std::thread* thread = NULL;
void run();
public:
~MyClass();
void start();
}
MyClass.cpp
MyClass:~MyClass() {
if (thread != NULL)
thread -> join();
}
void MyClass::run() {
//do stuff
}
void MyClass::start() {
thread = &std::thread (&MyClass::run, this);
}
Main.cpp的
int main() {
MyClass obj{};
obj.start();
return 0;
}
当我运行此代码时,我总是得到R6010 - abort() has been called
并且我不知道调用abort()
的原因。当我在main函数中创建线程时,它可以工作,但出于设计原因,我想在MyClass
中启动它。这有一种方法可以在MyClass
中启动线程吗?
P.S .: This问题非常相似,但答案并没有解决我的问题。
答案 0 :(得分:10)
这是因为std::thread
的句柄在被join
编辑或detach
编辑之前被销毁(超出范围)。
我建议:
class MyClass {
private:
std::thread thread;
void run();
public:
~MyClass();
void start();
}
和
MyClass:~MyClass() {
if (thread.joinable())
thread.join();
}
void MyClass::run() {
//do stuff
}
void MyClass::start() {
thread = std::thread (&MyClass::run, this); //Move assignment
}
答案 1 :(得分:1)
您需要保留std::thread
成员或使用new
来创建线程指针。实际上,std::thread
对象在start()
的末尾超出了范围,导致在线程上调用终止。