ThreadLocal <T>和静态方法?

Roy*_*mir 12 .net c# clr multithreading .net-4.0

正在使用类名访问静态字段,如下所示:

public class Me()
{ 
  public static int a=5;
}
Run Code Online (Sandbox Code Playgroud)

我可以访问它Me.a,因此它附加到.

但是当我看到:

static ThreadLocal<int> _x = new ThreadLocal<int> (() => 3);
Run Code Online (Sandbox Code Playgroud)

它保证每个线程看到不同的副本_x.

难道我们不是只看到static每个而不是每个线程?如何ThreadLocal管理为每个线程提供不同的副本_x

Hen*_*man 12

我们只是看到静态是每个类而不是每个线程?

是.因此,假设一个ThreadLocal<T>实例拥有一个static Dictionary<Thread, T>查找当前线程的值的实例.

这可能不是它实际上如何运作,但它是一个简单的解释,它是如何可能的.你可以自己写.

  • @Royi如果您对如何实现线程本地化感兴趣.在Windows下,每个线程都有一个TIB(线程信息块),其中包含堆栈范围,线程ID等信息.线程本地数据存储在一个表中,该表的地址本身存储在TIB中.所以你的"静态字段"基本上是指向"TIB + something"的指针,线程之间唯一的区别是`TIB`每个都有不同的值(TIB地址通常存储在FS中). (4认同)
  • `static`就足够了.所有线程只需要共享1个字典. (2认同)

das*_*ght 7

根据_xstatic说明符,参考确实是每个类一个.但是,只有引用将在所有线程之间共享,而不是其对象内的值.访问时_x.Value,ThreadLocal<T>调用在当前线程上提供存储的系统特定代码,并读取或写入该特定于线程的存储.