c ++ std :: поток, вызывающий метод из объекта, вызывает вызывающий деструктор этого класса - PullRequest
0 голосов
/ 05 октября 2019

У меня есть несколько вопросов по поводу этого кода:

#include <thread>
#include <unistd.h>
#include <iostream>

class A
{
public:
    ~A()
    {
        std::cout << "Destructor A: " << this << std::endl;
    }

    void operator()()
    {
        std::cout << "going to sleep 10 seconds.." << std::endl;
        sleep(10);
        std::cout << "wake" << std::endl;
    }
};

int main()
{
    std::cout << "begin" << std::endl;
    A* a = new A();
    std::thread th(*a);
    th.join();
    std::cout << "end" << std::endl;
    delete a;

    return 0;
}

Вывод:

g++ -std=c++17 test.cpp -pthread
./a.out 
begin
Destructor A: 0x7fff0b6bed27
going to sleep 10 seconds..
wake
Destructor A: 0x559d4e8012a8
end
Destructor A: 0x559d4e801280
  1. Почему сразу после вызова std :: thread th (* a) я на самом делеполучил вызов деструктора? это не имеет смысла.
  2. Почему в один и тот же деструктор поступили 3 вызова из разных случаев? В моем коде я создал 1 экземпляр A и удаляю его в конце основной функции. таким образом, это должен быть всего 1 отпечаток Destrutor A.
  3. при вызове std :: thread th (* a), конструктор std :: thread использует 'a' в качестве ссылки или создает новый экземпляроб этом (вызывая конструктор копирования A)?

Спасибо.

1 Ответ

1 голос
/ 05 октября 2019
  1. Поскольку std::thread не может быть уверенным в том, что переданное ему значение будет существовать после создания потока, оно создает копию переданного вами значения.

  2. Другая копия, сделанная decay_copy, вызывается в конструкторе std::thread.

  3. Новый экземпляр.

Вы можетеподробное объяснение конструктора std::thread здесь: https://en.cppreference.com/w/cpp/thread/thread/thread

...