ฉันต้องการลงทะเบียนกระทู้ในชั้นเรียนของฉันดังนั้นฉันตัดสินใจที่จะเพิ่มการตรวจสอบสำหรับthread_local
คุณสมบัติ:
#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;
}
รหัสนั้นง่าย ฉันBar
ชั้นจะมีคงที่สมาชิกthread_local
foo
หากมีการสร้างสแตติกthread_local
Foo foo
หมายความว่าเธรดจะถูกสร้างขึ้น
แต่เมื่อฉันเรียกใช้รหัสไม่มีอะไรในFoo()
ภาพพิมพ์และถ้าฉันลบความคิดเห็นในตัวBar
สร้างของที่ใช้foo
รหัสทำงานได้ดี
ฉันลองสิ่งนี้ใน GCC (7.4.0) และ Clang (6.0.0) และผลลัพธ์ก็เหมือนกัน ฉันเดาว่าคอมไพเลอร์พบว่าไม่ได้foo
ใช้และไม่สร้างอินสแตนซ์ ดังนั้น
- คอมไพเลอร์เพิกเฉยต่อ
static thread_local
สมาชิกหรือไม่ ฉันจะแก้ไขข้อบกพร่องนี้ได้อย่างไร - ถ้าเป็นเช่นนั้นเหตุใด
static
สมาชิกปกติจึงไม่มีปัญหานี้