当您在插槽中为线程A分配一些TLS时,您是否可以从线程B访问相同的插槽?
它是内部同步还是如何工作?
答案 0 :(得分:4)
不,线程本地存储的全部意义在于它是本地到线程 - 如果你访问不同线程中的相同插槽,你将得到的值< / em>线程而不是另一个。
如果需要在线程之间共享状态,请不要使用线程本地存储。
答案 1 :(得分:3)
函数的局部变量对于运行该函数的每个线程都是唯一的。这可以在TLS的帮助下完成,如前所述,每个线程都是 local 。 如果你想在线程之间共享一些数据,有几个选项,从使用全局变量或静态变量到内存映射文件等等......如果需要在线程之间共享数据,还要检查线程同步。
下图说明了TLS的工作原理。
有关详细信息,请查看MSDN。
答案 2 :(得分:3)
术语可能令人困惑,因为“slot”通常是内存位置或单个位置的隐喻。使用TLS,插槽只是线程私有存储中某个位置的“名称”。在x86 / x84上没有真正的线程本地存储 - 所有内存都是全局的 - 因此系统负责根据访问它的线程将TLS中的每个“槽”映射到不同的实际内存位置。来自同一线程的插槽请求导致相同的内存位置 - 从不同线程到相同插槽的访问会导致不同的内存位置。
因为每个线程都看到不同的数据,所以不需要同步。除非您选择将相同的对象存储在两个不同线程的TLS中,那么这是一个不同的故事,但这是一个非常人为的案例 - 共享不是因为TLS。