Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan storan setempat-benang?

Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan storan setempat-benang?

王林
王林asal
2024-05-06 13:42:02604semak imbas

Thread-local storage (TLS) dalam C++ menyediakan mekanisme untuk mengekalkan data peribadi bagi setiap thread dalam persekitaran berbilang thread, memastikan walaupun berbilang thread mengakses pembolehubah pada masa yang sama, ia tidak mengganggu antara satu sama lain. Dengan mengisytiharkan pembolehubah tempatan menggunakan kata kunci thread_local, contoh pembolehubah yang berasingan dibuat dalam setiap urutan, memastikan pengasingan data. Mekanisme ini boleh digunakan untuk mengekalkan pembilang khusus benang, bendera status dan data peribadi lain, mengelakkan masalah perlumbaan data dalam pengaturcaraan berbilang benang. . Dalam C++, TLS boleh dilaksanakan melalui kata kunci thread_local.

Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan storan setempat-benang?Cara ia berfungsi

thread_local pengisytiharan digunakan untuk mengisytiharkan pembolehubah tempatan yang mempunyai tika berasingan dalam setiap urutan. Apabila pembolehubah diakses, pengkompil akan menjana lokasi storan khusus benang dan nilai pembolehubah akan disimpan hanya di lokasi tersebut. Ini memastikan bahawa walaupun beberapa utas daripada utas berbeza mengakses pembolehubah pada masa yang sama, mereka tidak mengganggu satu sama lain.

Tatabahasa thread_local 关键字实现 TLS。

作用原理

thread_local 声明用于声明一个局部变量,该变量在每个线程中具有单独的实例。当访问该变量时,编译器将生成一个线程特定的存储位置,并且变量的值将仅存储在该位置。这确保了即使来自不同线程的多个线程正在同时访问该变量,它们也不会彼此干扰。

语法

语法如下:

thread_local <type> variable;

其中:

  • type 是变量的类型。
  • variable 是变量的名称。

实战案例

我们来看一个用 TLS 在多线程应用程序中计算全局计数器的示例:

// 定义一个全局计数器变量,没有任何线程安全保护
int global_counter = 0;

// 定义一个线程局部计数器变量
thread_local int thread_local_counter = 0;

// 执行增加计数器的线程函数
void increment_counter() {
  // 增加全局计数器
  global_counter++;

  // 增加线程局部计数器
  thread_local_counter++;
}

int main() {
  // 创建多个线程
  std::vector<std::thread> threads;
  for (int i = 0; i < 10; i++) {
    threads.push_back(std::thread(increment_counter));
  }

  // 等待所有线程完成
  for (auto& thread : threads) {
    thread.join();
  }

  // 输出结果
  std::cout << "Global counter: " << global_counter << std::endl; // 可能不是预期的值
  std::cout << "Thread local counter: " << thread_local_counter << std::endl; // 将输出每个线程的局部计数器值
}

在这个示例中,global_counter 可能会有并发的访问问题,导致不准确的结果。而 thread_local_counter

🎜 Sintaks adalah seperti berikut: 🎜rrreee🎜 Di mana: 🎜
  • type ialah jenis pembolehubah.
  • pembolehubah ialah nama pembolehubah.
🎜🎜Kes praktikal🎜🎜🎜Mari kita lihat contoh pengiraan pembilang global dalam aplikasi berbilang benang menggunakan TLS: 🎜rrreee🎜Dalam contoh ini, global_counter boleh Akan ada isu akses serentak, yang membawa kepada keputusan yang tidak tepat. Dan thread_local_counter memastikan bahawa setiap urutan mempunyai tika balas yang berasingan dan tidak akan ada masalah perlumbaan data. 🎜

Atas ialah kandungan terperinci Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan storan setempat-benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn