C ++分离线程在删除其关联对象后继续工作

时间:2014-06-19 12:03:40

标签: c++ multithreading

在作用域中,我创建了一个包含线程的对象。线程在对象c-tor中分离。最后我删除了该对象,但在释放相关的对象内存后,线程仍在继续。分离的线程是保存对象副本还是仅引用程序堆栈,这将被进一步删除?

struct test_detach {
    test_detach()
    : thr_(&test_detach::loop, this) {
        thr_.detach();
    }

    void loop() {
        while(true) {
            cout << "loop test" << endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }
    }

    std::thread thr_;
};

int main()
{
    {
        test_detach *test = new test_detach;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        delete test;
    }
    cout << "Sleep" << endl;;
    std::this_thread::sleep_for(std::chrono::seconds(3));

    cout << "Finish!" << endl;;

    return 0;
}

节目输出:

loop test
loop test
Sleep
loop test
loop test
loop test
loop test
loop test
loop test
Finish!

1 个答案:

答案 0 :(得分:1)

线程一直持续到程序终止。您的线程不使用特定test_detach结构的任何数据字段,因此没有SEGFAULT。但是,如果您将一个成员变量添加到结构中并尝试从主线程结构delete d后从分离的线程访问它,则可能会导致SEGFAULT / undefined行为等。test_detach结构位于堆上。它不会被复制到任何地方,这就是重点。但是:

void loop() {
   int x = 0;
    while(true) {
        cout << "loop test, x: " << x++ << endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

将正常工作,因为x位于为特定线程维护的堆栈上。