Share via


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:

  1. 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.

  2. 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 (baik static dan extern), objek statis lokal, dan anggota data statis kelas. Anda tidak dapat mendeklarasikan objek data otomatis dengan thread 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

__declspec
Kata kunci
Thread Local Storage (TLS)