C ++ Создание потока с помощью функции-члена non stati c - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать новый поток в c ++ с не статической c функцией-членом класса. Тем не менее, это похоже на сбой на ма c, и я не могу понять, почему. Вот минимальный пример:

class A {
public:
    void hello() {
        cout << "hello" << endl;
    }

    A() {
        cout << "As constructor" << endl;
        // thread(&hello, this);
    }

    void start() {
        thread(&A::hello, this);
    }
};

int main(){
    A test;
    test.start();

}

Я собираю ма c с этим:

clang++ -std=c++11 -stdlib=libc++ -pthread -o hello thread.cpp 

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вы должны вызвать std::thread::join, чтобы заблокировать текущий поток, пока поток не создал завершающее выполнение. В противном случае текущий поток может завершиться sh и вызвать преждевременное уничтожение объекта test.

например

void start() {
    thread t(&A::hello, this);
    t.join();
}
1 голос
/ 15 апреля 2020

Проблема двоякая:

  • main() не ожидает завершения потока, прежде чем уничтожить объект test, который МОЖЕТ вызвать крэ sh.

  • start() нигде не хранит объект std::thread, поэтому он немедленно уничтожается, что вызовет cra sh, так как к потоку все еще можно присоединиться, а std::thread деструктор вызывает std::terminate(), чтобы завершить вызывающий процесс, если поток является присоединяемым.

Вместо этого попробуйте что-то подобное:

class A {
private:
    std::thread thrd;

public:
    void hello() {
        cout << "hello" << endl;
    }

    A() {
        cout << "As constructor" << endl;
    }

    ~A() {
        cout << "As destructor" << endl;
        wait();
    }

    void start() {
        thrd = thread(&A::hello, this);
    }

    void wait() {
        if (thrd.joinable())
            thrd.join();
    }
};

int main(){
    A test;
    test.start();
    // do something else while the thread is running...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...