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++ : 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;
其中:
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
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. 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!