rangkaian
Khusus Microsoft
Pengubah thread
kelas penyimpanan yang diperluas digunakan untuk mendeklarasikan variabel lokal utas. Untuk portabel yang setara di C++11 dan yang lebih baru, gunakan penentu kelas penyimpanan thread_local untuk kode portabel. Pada Windows thread_local
diimplementasikan dengan __declspec(thread)
.
Sintaks
__declspec(thread)
declarator
Keterangan
Thread Local Storage (TLS) adalah mekanisme di mana setiap utas dalam proses multithreaded mengalokasikan penyimpanan untuk data khusus utas. Dalam program multi-alur standar, data dibagikan di antara semua utas proses tertentu, sedangkan penyimpanan lokal utas adalah mekanisme untuk mengalokasikan data per utas. Untuk diskusi lengkap utas, lihat Multithreading.
Deklarasi variabel lokal utas harus menggunakan sintaks atribut yang diperluas dan __declspec
kata kunci dengan thread
kata kunci. Misalnya, kode berikut mendeklarasikan variabel lokal utas bilangan bulat dan menginisialisasinya dengan nilai:
__declspec( thread ) int tls_i = 1;
Saat menggunakan variabel thread-local di pustaka yang dimuat secara dinamis, Anda perlu mengetahui faktor-faktor yang dapat menyebabkan variabel thread-local tidak diinisialisasi dengan benar:
Jika variabel diinisialisasi dengan panggilan fungsi (termasuk konstruktor), fungsi ini hanya akan dipanggil untuk utas yang menyebabkan biner/DLL dimuat ke dalam proses, dan untuk utas yang dimulai setelah biner/DLL dimuat. Fungsi inisialisasi tidak dipanggil untuk utas lain yang sudah berjalan ketika DLL dimuat. Inisialisasi dinamis terjadi pada panggilan DllMain untuk DLL_THREAD_ATTACH, tetapi DLL tidak pernah mendapatkan pesan tersebut jika DLL tidak dalam proses saat utas dimulai.
Variabel thread-local yang diinisialisasi secara statis dengan nilai konstan umumnya diinisialisasi dengan benar pada semua utas. Namun, pada Desember 2017 ada masalah kesesuaian yang diketahui dalam kompilator Microsoft C++ di mana
constexpr
variabel menerima inisialisasi dinamis daripada statis.Catatan: Kedua masalah ini diharapkan diperbaiki dalam pembaruan kompilator di masa mendatang.
Selain itu, Anda harus mengamati panduan ini saat mendeklarasikan objek dan variabel lokal utas:
Anda hanya dapat menerapkan
thread
atribut ke deklarasi dan definisi kelas dan data;thread
tidak dapat digunakan pada deklarasi atau definisi fungsi.Anda hanya dapat menentukan
thread
atribut pada item data dengan durasi penyimpanan statis. Ini termasuk objek data global (baikstatic
danextern
), objek statis lokal, dan anggota data statis kelas. Anda tidak dapat mendeklarasikan objek data otomatis denganthread
atribut .Anda harus menggunakan
thread
atribut untuk deklarasi dan definisi objek lokal utas, apakah deklarasi dan definisi terjadi dalam file yang sama atau file terpisah.Anda tidak dapat menggunakan
thread
atribut sebagai pengubah jenis.Karena deklarasi objek yang menggunakan
thread
atribut diizinkan, kedua contoh ini setara secara semantik:// declspec_thread_2.cpp // compile with: /LD __declspec( thread ) class B { public: int data; } BObject; // BObject declared thread local. class B2 { public: int data; }; __declspec( thread ) B2 BObject2; // BObject2 declared thread local.
Standar C mengizinkan inisialisasi objek atau variabel dengan ekspresi yang melibatkan referensi ke dirinya sendiri, tetapi hanya untuk objek nonstatis. Meskipun C++ biasanya mengizinkan inisialisasi dinamis objek dengan ekspresi yang melibatkan referensi ke dirinya sendiri, jenis inisialisasi ini tidak diizinkan dengan objek lokal utas. Contohnya:
// declspec_thread_3.cpp // compile with: /LD #define Thread __declspec( thread ) int j = j; // Okay in C++; C error Thread int tls_i = sizeof( tls_i ); // Okay in C and C++
Ekspresi
sizeof
yang menyertakan objek yang diinisialisasi tidak merupakan referensi ke dirinya sendiri dan diizinkan dalam C dan C++.
END Khusus Microsoft
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk