线程局部存储

3
当您在一个插槽中为线程A分配一些TLS时,是否可以从线程B访问同一个插槽?
这个过程是内部同步的吗?如果不是,它是如何工作的?

2
什么是“slot”?按定义,TLS 无法从另一个线程访问。 - Konrad Rudolph
1
@Konrad:有关插槽信息,请参阅Thread.AllocateSlot和Thread.AllocateNamedDataSlot。 - Jon Skeet
3个回答

4
不,线程本地存储的整个重点在于它是“本地”于线程的 - 如果您在另一个线程中访问相同的插槽,则会获取该线程而不是其他线程的值。
如果您需要在线程之间共享状态,请不要使用线程本地存储。

但是具有TLS插槽的数组是全局的,我不确定我理解这是怎么回事?还是我理解错了... - Tony The Lion
@Tony - 在幕后,操作系统会确保槽位为不同的线程指向不同的内存,就像你所选择的答案所示。即使TLS变量是全局的,实际使用的值对于每个线程都是独立的。 - mdma
据我所知,是的。可能需要某些权限,但如果有的话,我不知道具体细节。 - Jon Skeet

4
函数的本地变量对于运行该函数的每个线程都是唯一的。这可以通过TLS来实现,正如已经提到的那样,TLS对于每个线程都是本地的。 如果您想在线程之间共享一些数据,有几种选择,从使用全局或静态变量到内存映射文件等...如果需要在线程之间共享数据,请确保进行线程同步。 下图说明了TLS的工作原理。 有关详细信息,请查看MSDNalt text (来源:microsoft.com

我明白了,但是你的索引变量是全局的...所以它们可以被多个线程访问吗? - Tony The Lion
1
是的,全局或静态变量在多个线程之间共享。 - Incognito

3
术语可能会让人感到困惑,因为“slot”常常被用作内存位置或单个地点的隐喻。在TLS中,槽口只是指向线程私有存储中位置的“名称”。在x86/x84上,没有真正的线程本地存储——所有内存都是全局的——因此系统会根据正在访问它的线程将TLS中的每个“槽口”映射到不同的实际内存位置。同一线程对于一个槽口的请求会导致相同的内存位置,而不同线程对于同一槽口的访问则会导致不同的内存位置。
因为每个线程看到的数据都不同,所以同步就不再必要了。当然,除非你选择将同一对象存储在两个不同线程的TLS中,那就是另外一回事了,但这种情况相当牵强——共享并不是由于TLS引起的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接