【问题标题】:ThreadLocal<T> and static approach?ThreadLocal<T> 和静态方法?
【发布时间】:2012-07-20 11:10:29
【问题描述】:

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

public class Me()
{ 
  public static int a=5;
}

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

但是当我看的时候:

static ThreadLocal<int> _x = new ThreadLocal<int> (() => 3);

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

我们不是刚刚看到static 是每个class 而不是每个threadThreadLocal 如何设法为每个线程提供_x 的不同副本?

【问题讨论】:

  • 你疯狂的格式、间距和大写是怎么回事?请花一点时间整理一下您的帖子,或许还可以使其更简洁一些。
  • 每个类只有一个_x,但ThreadLocal&lt;T&gt; 实例为每个线程维护不同的值。
  • @Lee 是的,谢谢,但他是怎么做到的?它仍然标记为静态...
  • @RoyiNamir - 所以你的问题是ThreadLocal&lt;T&gt; 是如何工作的?
  • @RoyiNamir - 每个线程没有静态变量。您有一个静态 ThreadLocal&lt;T&gt; 实例,其中包含每个线程的 T 类型的值。

标签: c# .net multithreading .net-4.0 clr


【解决方案1】:

我们没有看到静态是每个类而不是每个线程吗?

是的。所以想象一个ThreadLocal&lt;T&gt; 实例拥有一个static Dictionary&lt;Thread, T&gt; 来查找当前线程的值。

这可能不是它的实际工作方式,但它是对它如何可能的简单解释。你可以自己写。

所以你仍然只有 1 个静态 _x。但是_x.Value 可以绑定到任何东西,比如当前线程。

【讨论】:

  • 但是,这个类仍然有一个 static 字段,所以它必须有它的静态字段。 - 你的想法是解决这个问题的一种方法,如果有某种代理机制的话。但我们没有使用它,我们实际上使用了基本关键字 static....我说的对吗?\
  • static 就足够了。所有线程只需要共享 1 个字典。
  • 哦,,,,所以你说字典本身是静态的....嗯,很有趣
  • 是的,您仍然只有 1 个静态 _x。但是_x.Value 可以绑定到任何东西。
  • @Royi 如果您对通常如何实现线程局部变量感兴趣。在 Windows 下,每个线程都有一个 TIB(线程信息块),其中包含堆栈范围、线程 ID 等信息。线程本地数据存储在一个表中,其地址本身存储在 TIB 中。所以你的“静态字段”基本上是一个指向TIB+something的指针,线程之间的唯一区别是TIB每个都有不同的值(TIB地址通常存储在FS中)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我的 C# 不是那么好,所以这里有一个相同效果的 C++ 答案:想象一个包含大数组的假设类:

    class Foo
    {
        int array[HUGE];
        int & get() { return array[this_thread_id()]; }
    }:
    

    现在您可以拥有一个单一的全局(或类静态)对象:

    Foo tlstorage;
    

    要从您说tlstorage.get() = 12; 的任何地方访问它。但是,数据存储在“属于”当前线程的插槽中。 整个存储是全局的,但每个线程只暴露一个切片。

    C 和 C++ 等其他语言对这一概念有原生支持,当您将全局或静态变量装饰为“线程局部”时,编译器会自动构建具有相同效果的东西。也许在 C# 中这是一个库功能,尽管它也可能映射到一些内在的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2011-08-11
      • 2022-06-10
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多