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_local
tí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. Bar
Lớp tôi có một thread_local
thà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 Bar
tạ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 foo
khô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_local
thà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
static
thành viên bình thường không có vấn đề này?