2010-06-26 102 views
3

当您为某个插槽中的线程A分配一些TLS时,您可以从线程B访问相同的插槽吗?线程本地存储

它在内部是同步还是如何工作?

+2

“slot”是什么意思?根据定义,TLS无法从其他线程访问。 – 2010-06-26 12:59:12

+1

@Konrad:有关插槽信息,请参阅Thread.AllocateSlot和Thread.AllocateNamedDataSlot。 – 2010-06-26 13:01:42

回答

3

函数的局部变量对于运行函数的每个线程都是唯一的。这可以在TLS的帮助下完成,如前所述,每个线程都有本地。 如果你想在线程之间共享一些数据,有几个选择从使用全局或静态变量到内存映射文件等等。如果你需要在线程之间共享数据,还要检查线程同步。

下图说明了TLS的工作原理。

欲了解更多详情检查MSDN

alt text http://i.msdn.microsoft.com/dynimg/IC495837.png

+0

是的,我明白了,但是你的索引变量是全局的...所以他们可以被多个线程访问? – 2010-06-26 13:11:32

+1

是全局或静态变量在多个线程之间共享。 – Incognito 2010-06-26 13:19:22

+0

图片链接已被删除 – 2011-06-30 00:15:29

4

不,线程本地存储的全部意义就在于它的当地的话题 - 如果你在不同的线程访问相同的插槽,你会得到价值线程,而不是另一种。

如果您需要在线程之间共享状态,请勿使用线程本地存储。

+0

但拥有TLS插槽的阵列是全球性的,我不知道我明白这是怎么回事?或者我弄错了...... – 2010-06-26 13:04:10

+0

@Tony - 操作系统负责确保插槽指向不同内存的不同线程,如选择答案所示。即使TLS变量是全局变量,实际使用的值对于每个线程都是不同的。 – mdma 2010-06-26 15:20:56

+0

@JonSkeet然后任何线程可以分配TLS插槽? – onmyway133 2013-07-25 09:22:14

3

的术语可以是混乱,因为“时隙”是经常用于存储器位置或一个地方的隐喻。使用TLS时,插槽仅仅是线程私有存储中某个位置的“名称”。在x86/x84上,没有真正的线程本地存储 - 所有内存都是全局的 - 所以根据正在访问的线程,系统负责将TLS中的每个“插槽”映射到不同的实际内存位置。来自同一线程的针对一个插槽的请求导致相同的存储器位置 - 从不同线程访问相同的插槽导致不同的存储器位置。

因为每个线程都看到不同的数据,所以不需要同步。除非你选择在两个不同线程的TLS中存储相同的对象,那么这是一个不同的故事,但这是一个非常人为的案例 - 共享不是因为TLS。