Saya ingin melakukan pendaftaran utas di kelas saya, jadi saya memutuskan untuk menambahkan tanda centang untuk thread_localfitur ini:
#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;
}
Kode itu sederhana. Saya Barkelas memiliki statis thread_localanggota foo. Jika statis thread_local Foo foodibuat, itu berarti utas dibuat.
Tetapi ketika saya menjalankan kode, tidak ada dalam Foo()cetakan, dan jika saya menghapus komentar di Barkonstruktor, yang menggunakan foo, kode berfungsi dengan baik.
Saya mencoba ini pada GCC (7.4.0) dan Dentang (6.0.0) dan hasilnya sama. Saya kira kompiler menemukan bahwa footidak digunakan dan tidak menghasilkan instance. Begitu
- Apakah kompiler mengabaikan
static thread_localanggota? Bagaimana saya bisa men-debug untuk ini? - Jika demikian, mengapa anggota normal
statictidak memiliki masalah ini?