Maison > développement back-end > C++ > le corps du texte

Programmation simultanée C++ : comment utiliser le stockage local des threads ?

王林
Libérer: 2024-05-06 13:42:02
original
616 Les gens l'ont consulté

Le stockage local par thread (TLS) en C++ fournit un mécanisme permettant de conserver les données privées de chaque thread dans un environnement multithread, garantissant que même si plusieurs threads accèdent à la variable en même temps, ils n'interfèrent pas les uns avec les autres. En déclarant une variable locale à l'aide du mot-clé thread_local, une instance distincte de la variable est créée dans chaque thread, garantissant ainsi l'isolation des données. Ce mécanisme peut être utilisé pour gérer des compteurs, des indicateurs d'état et d'autres données privées spécifiques aux threads, évitant ainsi les problèmes de course aux données dans la programmation multithread.

Programmation simultanée C++ : comment utiliser le stockage local des threads ?

Programmation simultanée C++ : tirer parti du stockage local par thread

Le stockage local par thread (TLS) est un mécanisme permettant de conserver les données privées de chaque thread dans un environnement multithread. En C++, TLS peut être implémenté via le mot-clé thread_local. thread_local 关键字实现 TLS。

作用原理

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

语法

语法如下:

thread_local <type> variable;
Copier après la connexion

其中:

  • 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; // 将输出每个线程的局部计数器值
}
Copier après la connexion

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

🎜Comment ça marche🎜🎜🎜La déclaration thread_local est utilisée pour déclarer une variable locale qui a une instance distincte dans chaque thread. Lors de l'accès à la variable, le compilateur générera un emplacement de stockage spécifique au thread et la valeur de la variable sera stockée uniquement à cet emplacement. Cela garantit que même si plusieurs threads de différents threads accèdent à la variable en même temps, ils n'interfèrent pas les uns avec les autres. 🎜🎜🎜Grammar🎜🎜🎜La syntaxe est la suivante : 🎜rrreee🎜où : 🎜
  • type est le type de la variable.
  • variable est le nom de la variable.
🎜🎜Cas pratique🎜🎜🎜Regardons un exemple de calcul d'un compteur global dans une application multi-thread utilisant TLS : 🎜rrreee🎜Dans cet exemple, global_counter peut Il y aura des problèmes d'accès simultanés, conduisant à des résultats inexacts. Et thread_local_counter garantit que chaque thread a une instance de compteur distincte et qu'il n'y aura pas de problèmes de course aux données. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal