Saya ingin melakukan pendaftaran utas di kelas saya, jadi saya memutuskan untuk menambahkan tanda centang untuk thread_local
fitur 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 Bar
kelas memiliki statis thread_local
anggota foo
. Jika statis thread_local
Foo foo
dibuat, itu berarti utas dibuat.
Tetapi ketika saya menjalankan kode, tidak ada dalam Foo()
cetakan, dan jika saya menghapus komentar di Bar
konstruktor, 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 foo
tidak digunakan dan tidak menghasilkan instance. Begitu
- Apakah kompiler mengabaikan
static thread_local
anggota? Bagaimana saya bisa men-debug untuk ini? - Jika demikian, mengapa anggota normal
static
tidak memiliki masalah ini?
sumber
Saya menemukan informasi ini di " Penanganan ELF Untuk Penyimpanan Thread-Lokal " yang dapat membuktikan jawaban @LF
sumber