内存问题和ThreadLocal <t> </t>

时间:2011-04-22 21:40:34

标签: c# .net multithreading thread-local

我注意到ThreadLocal<T>实现了IDisposable,这意味着我在使用它时应该处理一个线程局部变量。我只是好奇具体的问题是什么,我应该小心做什么和/或避免做什么。

当线程退出时,线程的本地存储是否会被丢弃?如果我不处理我的ThreadLocal成员,最糟糕的情况是什么?

如果我有一个全局线程局部(oxymoron?hehe)变量(或者ThreadStatic变量)并且我在ThreadPool中的线程上分配了这个值,该怎么办?我是否必须小心取消分配线程本地值,或者这不是一个问题?

1 个答案:

答案 0 :(得分:5)

我不认为线程本地存在由线程自动处理 - 这仍然留给开发人员实现。来自MSDN:

  
    

在释放对ThreadLocal的最后一个引用之前,始终调用Dispose。否则,在垃圾回收器调用ThreadLocal对象的Finalize方法之前,不会释放它正在使用的资源。

  

但是,如果您的线程本地类型不会消耗任何保证一次性的资源(例如int或其他原始类型),那么可能不会丢弃它,因为垃圾收集器最终会处理它。 / p>

通过多个ThreadLocal对象引用相同的对象实例通常是不明智的 - 实际上,它与线程本地存储通常试图完成的内容相悖。孤立的线程本地可以被假定为“线程安全” - 在某种意义上,没有其他线程(原则上)应该可以访问它们。请记住,线程安全是一个细微的概念,需要您建立关于共享内存的特定约束和期望......我在这个上下文中使用了松散意义上的术语。