在C语言中,thread_local
和 tss_create
都是用于处理线程本地存储(TLS,Thread-Local Storage)的机制,但它们有不同的应用场景和用途。
-
thread_local
:-
应用场景:
thread_local
是C11标准引入的关键字,用于定义线程本地存储的变量。它通常用于在多线程程序中创建线程本地的全局变量。这些变量每个线程都有一份独立的副本,互不干扰,但在同一线程内部共享。 -
特点:
thread_local
更容易使用,因为你只需要在变量声明前加上thread_local
关键字,编译器会负责处理线程本地存储的细节。这是一个静态的存储期变量,可以在栈上或堆上分配。 -
示例:
thread_local int tls_variable; // 线程本地存储的变量
-
-
tss_create
:-
应用场景:
tss_create
是一组函数,通常用于在多线程程序中创建线程特定数据(TSD,Thread-Specific Data)。与thread_local
不同,TSD 可以关联一个特定的清理函数,当线程退出时,这个函数可以用于清理线程本地存储的数据。 -
特点:
tss_create
是更底层的API,需要手动创建、分配和释放线程本地存储,以及关联清理函数。这允许你有更多的控制权,但也需要更多的手动管理。 -
示例:
static tss_t key; // TSD的键 static void destructor(void *data) { // 清理函数,在线程退出时调用 free(data); } int main() { tss_create(&key, destructor); // 创建TSD,并关联清理函数 // 在每个线程中设置TSD数据 int *thread_data = malloc(sizeof(int)); *thread_data = 42; tss_set(key, thread_data); // 在线程退出时,清理函数会被自动调用,释放内存 // ... tss_delete(key); return 0; }
-