函数的本地变量对于运行该函数的每个线程都是唯一的。这可以通过TLS来实现,正如已经提到的那样,TLS对于每个线程都是本地的。 如果您想在线程之间共享一些数据,有几种选择,从使用全局或静态变量到内存映射文件等...如果需要在线程之间共享数据,请确保进行线程同步。 下图说明了TLS的工作原理。 有关详细信息,请查看MSDN。 (来源:microsoft.com)
术语可能会让人感到困惑,因为“slot”常常被用作内存位置或单个地点的隐喻。在TLS中,槽口只是指向线程私有存储中位置的“名称”。在x86/x84上,没有真正的线程本地存储——所有内存都是全局的——因此系统会根据正在访问它的线程将TLS中的每个“槽口”映射到不同的实际内存位置。同一线程对于一个槽口的请求会导致相同的内存位置,而不同线程对于同一槽口的访问则会导致不同的内存位置。因为每个线程看到的数据都不同,所以同步就不再必要了。当然,除非你选择将同一对象存储在两个不同线程的TLS中,那就是另外一回事了,但这种情况相当牵强——共享并不是由于TLS引起的。