【发布时间】:2010-01-29 00:08:50
【问题描述】:
我最近发现 "ThreadStatic" 属性非常有用,但现在让我想要一个 "ThreadLocal" 类型属性 让我拥有基于每个线程的非静态数据成员。
现在我知道这会产生一些重要的影响,但是:
C#/.net 中是否已经内置了这样的东西? 或者由于目前看来答案是否定的(对于 .net
我可以自己想出一种合理的方法来实现它,但如果可用的话,我会使用已经存在的东西。
稻草人示例,如果它尚不存在,它将实现我正在寻找的东西:
class Foo
{
[ThreadStatic]
static Dictionary<Object,int> threadLocalValues = new Dictionary<Object,int>();
int defaultValue = 0;
int ThreadLocalMember
{
get
{
int value = defaultValue;
if( ! threadLocalValues.TryGetValue(this, out value) )
{
threadLocalValues[this] = value;
}
return value;
}
set { threadLocalValues[this] = value; }
}
}
请原谅任何 C# 的无知。我是一名 C++ 开发人员,最近才开始接触 C# 和 .net 更有趣的功能
我仅限于 .net 3.0,也许是 3.5(项目已经/即将迁移到 3.5)。
特定用例是线程特定的回调列表(使用虚构的 [ThreadLocal] 属性) a la:
class NonSingletonSharedThing
{
[ThreadLocal] List<Callback> callbacks;
public void ThreadLocalRegisterCallback( Callback somecallback )
{
callbacks.Add(somecallback);
}
public void ThreadLocalDoCallbacks();
{
foreach( var callback in callbacks )
callback.invoke();
}
}
【问题讨论】:
-
我看不出区别。如果数据是每个线程的,为什么 ThreadStatic 不是您需要的?换句话说,本地到什么?
-
这就是我提供示例的原因。我正在为一个类寻找每个胎面的非静态数据成员。 ThreadStatic 仅适用于静态数据成员。
-
我真的很好奇,这个用例是什么?如果对象绑定到局部变量,则它及其所有成员实际上都是线程局部的。如果对象绑定到全局变量,则全局上的 ThreadStatic 将使它(及其成员)成为线程本地的。需要共享对象才能使线程本地存储有用,它是如何共享的,以便使选定的成员有用地成为线程本地的?
-
我仍然看不到实用程序:(。这是您的实际用例吗?NonSingletonSharedThing 如何在多个线程之间共享?您知道 ThreadLocalDoCallbacks() 不会调用其他线程的回调那些线程对吗?据我所知,这个例子相当于在每个线程中都有一个本地回调列表,没有什么可共享的,也不需要共享。
-
本地人存在于堆栈中,因此根据定义它们是线程本地的
标签: c# .net multithreading attributes