2016-02-29 125 views
0

我正在阅读操作系统概念中的主题,并且遇到了“线程本地存储(TLS)”。我的理解是,TLS与静态或全局数据类似,但对于单个线程来说更为独特。它有点混淆了这里的独特之处?什么是线程本地存储?我们为什么需要它?

为什么我们不能通过runner(即线程的实际代码)将数据作为参数传递给这个函数?

+0

'为什么我们不能将数据作为参数传递给这个函数?''''''''''''''''''''''''''本地和全球数据是*替代品*,每个都有自己的道具。和缺点。 – Tsyvarev

+0

我已经写了几十年的mutithreaded应用程序,但并未使用线程'TLS'的全局变量。有多少开发者感到惊讶。 'globals are bad'很好,但很高兴使用TLS。 –

回答

1

让我们假设你在阿达工作。在你的Ada程序中,你定义了一个任务(线程),其中包含一个只能由任务访问的[静态]变量。您现在创建任务的多个实例。然后,您需要每个任务的该[静态]变量的副本。

这就是您的实现可以使用线程本地存储的地方。换句话说,它是为程序中的每个线程复制的静态内存区域。

作为TLS的替代方案,线程可以在堆栈顶部分配这样的存储。

0

静态和全局数据在所有线程之间共享。如果您修改了全局/静态变量,则它对所有线程均可见。与全局变量/共享变量不同,如果您在TLS中创建变量,则每个线程都有自己的变量副本,即对变量的更改对于线程是本地的。与全局变量不同,在全局变量中,通过段来访问,使用(gs/fs)段来访问TLS变量。了解它的一个好方法是查看编译器生成的反汇编。

相关问题