赞
踩
在C或C++中,线程局部存储(Thread-Local Storage,简称TLS)是一种用于存储线程特有数据的方法。这意味着每个线程都可以访问它自己的变量实例,而不会影响到其他线程中的同名变量。这在多线程程序中非常有用,因为它可以避免对共享数据的竞争和同步开销。
C++11引入了thread_local
关键字来简化线程局部存储的使用。在C中,则需要依赖操作系统或编译器提供的特定机制,如GCC的__thread
关键字。
thread_local
示例下面是一个C++11中使用thread_local
的简单例子:
#include <iostream> #include <thread> #include <vector> // 定义一个线程局部的整型变量 thread_local int tls_counter = 0; void increment_counter() { tls_counter++; // 每个线程都会独立地增加自己的tls_counter std::cout << "Thread " << std::this_thread::get_id() << " incremented tls_counter to " << tls_counter << std::endl; } int main() { std::vector<std::thread> threads; // 创建10个线程 for (int i = 0; i < 10; ++i) { threads.emplace_back(increment_counter); } // 等待所有线程完成 for (auto& th : threads) { th.join(); } return 0; }
输出:
Thread 140517560022592 incremented tls_counter to 1
Thread 140517551629888 incremented tls_counter to 1
Thread 140517534844480 incremented tls_counter to 1
Thread 140517543237184 incremented tls_counter to 1
Thread 140517409019456 incremented tls_counter to 1
Thread 140517526451776 incremented tls_counter to 1
Thread 140517518059072 incremented tls_counter to 1
Thread 140517438387776 incremented tls_counter to 1
Thread 140517429995072 incremented tls_counter to 1
Thread 140517421602368 incremented tls_counter to 1
在这个例子中,tls_counter
是一个线程局部变量,每个线程都会拥有自己的tls_counter
实例。因此,尽管所有线程都调用了increment_counter
函数,但每个线程都会独立地增加自己的tls_counter
,而不会影响到其他线程的tls_counter
。
__thread
在C中的示例对于C语言,可以使用GCC的__thread
关键字来实现类似的功能:
#include <stdio.h> #include <pthread.h> #include <stdlib.h> // 定义一个线程局部的整型变量 __thread int tls_counter = 0; void* increment_counter(void* arg) { tls_counter++; // 每个线程都会独立地增加自己的tls_counter printf("Thread %ld incremented tls_counter to %d\n", (long)pthread_self(), tls_counter); return NULL; } int main() { pthread_t threads[10]; // 创建10个线程 for (int i = 0; i < 10; ++i) { pthread_create(&threads[i], NULL, increment_counter, NULL); } // 等待所有线程完成 for (int i = 0; i < 10; ++i) { pthread_join(threads[i], NULL); } return 0; }
Thread 127565616375360 incremented tls_counter to 1
Thread 127565599589952 incremented tls_counter to 1
Thread 127565624768064 incremented tls_counter to 1
Thread 127565582804544 incremented tls_counter to 1
Thread 127565607982656 incremented tls_counter to 1
Thread 127565591197248 incremented tls_counter to 1
Thread 127565574411840 incremented tls_counter to 1
Thread 127565477959232 incremented tls_counter to 1
Thread 127565486351936 incremented tls_counter to 1
Thread 127565494744640 incremented tls_counter to 1
这个例子与C++的例子类似,但使用了C的pthread
库来创建和管理线程,并使用__thread
关键字来声明线程局部变量。
注意,虽然__thread
在GCC中非常有用,但它并不是C语言标准的一部分,因此在使用时需要考虑跨平台兼容性问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。