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

时间:2014-05-02 14:42:45

标签: c++ multithreading c++11

我有以下三个文件:

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问题非常相似,但答案并没有解决我的问题。

2 个答案:

答案 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()的末尾超出了范围,导致在线程上调用终止。