dev*_*os1 7 .net c# multithreading thread-local
我注意到这个ThreadLocal<T>实现IDisposable,暗示我在使用它时应该处理一个线程局部变量.我只是好奇具体的问题是什么,我应该小心做什么和/或避免做什么.
当线程退出时,线程的本地存储是否会被丢弃?如果我不处理我的ThreadLocal成员,最糟糕的情况是什么?
如果我有一个全局线程局部(oxymoron?hehe)变量(或者一个ThreadStatic变量)并且我在ThreadPool中的线程上赋值这个怎么办?我是否必须小心取消分配线程本地值,或者这不是一个问题?
我不相信线程本地在它存在时会被线程自动处理 - 这仍然留给开发人员实现.来自MSDN:
始终在释放对ThreadLocal的最后一个引用之前调用Dispose.否则,在垃圾回收器调用ThreadLocal对象的Finalize方法之前,不会释放它正在使用的资源.
但是,如果您的线程本地类型不会消耗任何保证一次性的资源(例如int或其他原始类型),那么可能不会丢弃它,因为垃圾收集器最终会处理它.
让一个对象的同一个实例被多个对象引用通常是不明智的ThreadLocal- 事实上,它与线程本地存储通常试图完成的内容相悖.孤立的线程本地可以被假定为"线程安全" - 在某种意义上,没有其他线程(原则上)应该可以访问它们.请记住,线程安全是一个细微的概念,需要您建立关于共享内存的特定约束和期望......我在这个上下文中使用了松散意义上的术语.