Tôi muốn thực hiện một số đăng ký chủ đề trong lớp của mình, vì vậy tôi quyết định thêm một kiểm tra cho thread_localtính năng:
#include <iostream>
#include <thread>
class Foo {
public:
Foo() {
std::cout << "Foo()" << std::endl;
}
~Foo() {
std::cout << "~Foo()" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "Bar()" << std::endl;
//foo;
}
~Bar() {
std::cout << "~Bar()" << std::endl;
}
private:
static thread_local Foo foo;
};
thread_local Foo Bar::foo;
void worker() {
{
std::cout << "enter block" << std::endl;
Bar bar1;
Bar bar2;
std::cout << "exit block" << std::endl;
}
}
int main() {
std::thread t1(worker);
std::thread t2(worker);
t1.join();
t2.join();
std::cout << "thread died" << std::endl;
}
Mã rất đơn giản. BarLớp tôi có một thread_localthành viên tĩnh foo. Nếu một tĩnh thread_local Foo foođược tạo, nó có nghĩa là một luồng được tạo.
Nhưng khi tôi chạy mã, không có gì trong Foo()bản in và nếu tôi xóa nhận xét trong hàm Bartạo, sử dụng foo, mã sẽ hoạt động tốt.
Tôi đã thử điều này trên GCC (7.4.0) và Clang (6.0.0) và kết quả là như nhau. Tôi đoán rằng trình biên dịch phát hiện ra rằng fookhông được sử dụng và không tạo ra một thể hiện. Vì thế
- Trình biên dịch đã bỏ qua các
static thread_localthành viên? Làm thế nào tôi có thể gỡ lỗi cho điều này? - Nếu vậy, tại sao một
staticthành viên bình thường không có vấn đề này?