Pembolehubah Setempat Benang dalam C 11: Statik Secara Automatik?
Dalam C 11, pembolehubah thread_local ialah mekanisme yang berkuasa untuk mengurus data yang unik untuk setiap utas pelaksana. Walau bagaimanapun, persoalan biasa timbul: adakah ia secara automatik dianggap sebagai statik? Untuk menjawabnya, mari kita periksa dua segmen kod:
Segmen Kod 1
<code class="cpp">void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }</code>
Segmen Kod 2
<code class="cpp">void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }</code>
Piawaian C memberikan jawapan yang pasti:
Mengikut Piawaian:
Apabila thread_local digunakan pada pembolehubah skop blok, penentu kelas storan statik tersirat jika ia tidak kelihatan secara eksplisit.
Oleh itu, Kod Segmen 1 adalah bersamaan dengan Kod Segmen 2. Walau bagaimanapun, ini tidak bermakna bahawa thread_local dan pembolehubah statik boleh ditukar ganti.
Thread-Local vs. Statik Pembolehubah
Walaupun thread_local pembolehubah membayangkan storan statik, mereka mempunyai perbezaan asas daripada pembolehubah statik:
Semua pembolehubah diisytiharkan dengan kata kunci thread_local mempunyai _tempoh storan benang_. Storan untuk entiti ini kekal sepanjang tempoh urutan ia dicipta. Terdapat objek atau rujukan yang berbeza bagi setiap utas dan penggunaan nama yang diisytiharkan merujuk kepada entiti yang dikaitkan dengan utas semasa.
Pada dasarnya, tempoh penyimpanan utas memastikan setiap utas mempunyai contoh sendiri pembolehubah thread_local. Ini berbeza dengan pembolehubah statik, yang dikongsi merentas semua urutan dalam satu proses.
Implikasi untuk Multithreading
Seperti yang dicadangkan oleh soalan asal, thread_local variables boleh digunakan untuk menggantikan pembolehubah statik dalam program berbilang benang, menghapuskan keadaan perlumbaan yang berpotensi dan perbalahan data. Walau bagaimanapun, adalah penting untuk diingat bahawa pembolehubah thread_local tidak dikongsi merentasi urutan dan hanya boleh digunakan apabila data khusus thread diperlukan.
Atas ialah kandungan terperinci Adakah pembolehubah benang-tempatan dalam C 11 secara automatik dianggap sebagai statik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!