當C++ 11我已經創建了下面的例子測試線程:的std ::線程類的構造函數和析構函數
#include <iostream>
#include <thread>
class Foo {
public:
Foo(void) {
std::cout << "Constructor called: " << this << std::endl;
}
~Foo(void) {
std::cout << "Destructor called: " << this << std::endl;
}
void operator()() const {
std::cout << "Operatior called: " << this << std::endl;
}
};
void test_normal(void) {
std::cout << "====> Standard example:" << std::endl;
Foo f;
}
void test_thread(void) {
std::cout << "====> Thread example:" << std::endl;
Foo f;
std::thread t(f);
t.detach();
}
int main(int argc, char **argv)
{
test_normal();
test_thread();
for(;;);
}
打印出以下幾點:
爲什麼析構函數調用了6次線程?爲什麼線程報告不同的內存位置?
編輯 當添加移動和複製構造函數輸出:
我明白了。我現在把我的輸出添加到了帖子中。看起來我有3個額外的移動構造函數調用。這與編譯器有關嗎? – toeplitz
會有當你創建'Foo'一個對象調用構造,當您將它傳遞給線程構造一個拷貝構造調用。其餘的與實施有關。 – Praetorian