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
- 为什么在调用 std::thread th(*a) 之后我实际上得到了析构函数调用?这没有意义。
- 为什么不同的实例对同一个析构函数有 3 次调用?在我的代码中,我创建了 A 的 1 个实例,并在 main 函数的末尾将其删除。所以它应该只是 A destrutor 的 1 个印刷品。
- 当调用 std::thread th(*a) 时,std::thread 的构造函数使用 'a' 作为引用或者创建它的新实例(通过调用复制构造函数A)?
谢谢。
由于std::thread
无法确定您传递给它的值在创建线程后是否存在,因此它会复制您传递的值。
由 decay_copy
完成的另一个副本,在 std::thread
的构造函数中调用。
新实例。
std::thread
的构造函数可以在这里得到详细的解释:https://en.cppreference.com/w/cpp/thread/thread/thread
关于这段代码我有几个问题:
#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
- 为什么在调用 std::thread th(*a) 之后我实际上得到了析构函数调用?这没有意义。
- 为什么不同的实例对同一个析构函数有 3 次调用?在我的代码中,我创建了 A 的 1 个实例,并在 main 函数的末尾将其删除。所以它应该只是 A destrutor 的 1 个印刷品。
- 当调用 std::thread th(*a) 时,std::thread 的构造函数使用 'a' 作为引用或者创建它的新实例(通过调用复制构造函数A)?
谢谢。
由于
std::thread
无法确定您传递给它的值在创建线程后是否存在,因此它会复制您传递的值。由
decay_copy
完成的另一个副本,在std::thread
的构造函数中调用。新实例。
std::thread
的构造函数可以在这里得到详细的解释:https://en.cppreference.com/w/cpp/thread/thread/thread