c++ std::thread 从对象原因调用方法到调用此 class 的析构函数

c++ std::thread calling method from object cause to calling destructor of this class

关于这段代码我有几个问题:

#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 次调用?在我的代码中,我创建了 A 的 1 个实例,并在 main 函数的末尾将其删除。所以它应该只是 A destrutor 的 1 个印刷品。
  3. 当调用 std::thread th(*a) 时,std::thread 的构造函数使用 'a' 作为引用或者创建它的新实例(通过调用复制构造函数A)?

谢谢。

  1. 由于std::thread无法确定您传递给它的值在创建线程后是否存在,因此它会复制您传递的值。

  2. decay_copy 完成的另一个副本,在 std::thread 的构造函数中调用。

  3. 新实例。

std::thread的构造函数可以在这里得到详细的解释:https://en.cppreference.com/w/cpp/thread/thread/thread