C++ 11:使用成员函数和对象启动对象中的线程

Enn*_*eon 1 c++ multithreading c++11

我有以下三个文件:

MyClass.h

class MyClass {
private:
    std::thread* thread = NULL;
    void run();
public:
    ~MyClass();
    void start();
}
Run Code Online (Sandbox Code Playgroud)

MyClass.cpp

MyClass:~MyClass() {
    if (thread != NULL)
        thread -> join();
}

void MyClass::run() {
    //do stuff
}

void MyClass::start() {
    thread = &std::thread (&MyClass::run, this);
}
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

int main() {
    MyClass obj{};
    obj.start();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我总是得到R6010 - abort() has been called,我不知道为什么abort()被调用.当我在main函数中创建线程时,它可以工作,但出于设计原因,我想启动它MyClass.这有一种方法可以启动线程MyClass吗?

PS: 这个问题很相似,但答案并没有解决我的问题.

W.B*_*.B. 10

这是因为在编辑或编辑std::thread之前,句柄被销毁(超出范围).joindetach

我建议:

class MyClass {
private:
    std::thread thread;
    void run();
public:
    ~MyClass();
    void start();
}
Run Code Online (Sandbox Code Playgroud)

和:

MyClass:~MyClass() {
    if (thread.joinable())
        thread.join();
}

void MyClass::run() {
    //do stuff
}

void MyClass::start() {
    thread = std::thread (&MyClass::run, this); //Move assignment
}
Run Code Online (Sandbox Code Playgroud)