Почему создание объекта и указателя объекта ведет себя по-разному, когда я создаю поток в конструкторе? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть класс, и в конструкторе класса я хочу запустить поток.Поэтому я назвал это-> mythread = std :: thread (foo).Теперь, если я создаю объект класса, функция foo выполняется, и я могу видеть печать с помощью функции foo, то есть "foo .. foo .. foo ..". Это поведение отличается, когда я создаю указатель класса, в этом случае функцияФу не выполняется вообще.Здесь я упомянул мой код, может кто-нибудь пройти код и сообщить мне, что здесь происходит?

#include <iostream>
#include <thread>

using namespace std;

void foo() {
    cout << "foo.. foo.. foo.." << endl;
}

class test {
    public:
        test();
        ~test();

    private:
        std::thread m_thread;
};

test::test() {
    this->m_thread = std::thread(foo);
}
test::~test() {
    m_thread.join();
}

int main() {
    test t;                 // function foo() executes
    test *t1 = new test;    // function foo() does not executes
    test *t1 = new test();  // function foo() does not executes

    return 0;
}

1 Ответ

0 голосов
/ 08 июня 2019

И t, и t1 являются локальными переменными.Когда main заканчивается, эти объекты уничтожаются, в случае t вызывается его деструктор, который вызывает join в потоке, и вы можете увидеть тело потока, т.е. "foo" на консоли.В случае t1 освобождается память для хранения указателя, но деструктор test не вызывается - вы должны вызвать delete t1, чтобы явно вызвать dtor из test.Тогда main возвращается только в том случае, если функция foo (как тело потока) завершена, и вы увидите тот же результат, что и при создании t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...