属于同一进程的线程共享进程的数据。实际上,这种数据共享提供了多线程编程的好处之一。但是,在某些情况下,每个线程可能需要自己的某些数据副本。我们称这样的数据为线程本地存储(或TLS)

例如,在事务处理系统中,我们可以在一个单独的线程中为每个事务服务。此外,每个事务可能被分配一个唯一的标识符。要将每个线程与事务的惟一标识符关联起来,我们可以使用线程本地存储。

很容易将TLS与局部变量(local variables)混淆。然而,局部变量仅在单个函数调用时可见,而TLS数据在函数调用之间是可见的。

在某些方面,TLS与static数据类似。不同之处在于TLS数据对于每个线程都是唯一的。大多数线程库(包括Windows和Pthread)都为线程本地存储提供了某种形式的支持;Java也提供了支持。

在某些方面,TLS类似于静态数据;不同之处在于TLS数据对每个线程都是唯一的。(实际上,TLS通常被声明为静态的。)大多数线程库和编译器都支持TLS。例如,Java提供了一个带有set()和get()方法的ThreadLocal对象的类。Pthreads包含类型pthread_key_t,它提供特定于每个线程的键。然后可以使用此键访问TLS数据。微软的c#语言仅仅需要添加存储属性[ThreadStatic]来声明线程本地数据。gcc编译器为声明TLS数据提供存储类关键字__thread。例如,如果我们希望为每个线程分配唯一标识符,我们将声明如下:

static __thread int threadID;

results matching ""

    No results matching ""