堆栈溢出中的这个问题询问ThreadStatic是如何实现的:ThreadStatic属性是如何工作的?
一些人建议将其视为Thread对象的扩展。我不确定这是否意味着它是基于win32 TLS的。
我的问题是,我能以某种方式从当前线程访问ThreadStatic的值吗?也就是说,在本机代码中。
例如,如果我可以使用win32线程标识内存中所有线程静态字段所在的区域,并找到需要检索的特定字段。
Thx
发布于 2019-01-07 16:06:44
正如您所引用的答案中所解释的,[ThreadStatic]功能是由.NET运行时实现的,而不是由C#编译器实现的。
这意味着,您需要反向工程运行时的数据结构,以获得对所需数据的访问。
或者,您可以使用ICorProfilerInfo接口。这是一个非托管接口,如您所需。
特别是,您需要ICorProfilerInfo2::GetThreadStaticAddress方法。它接受类ID、字段ID和线程ID作为输入参数,并提供具有指定ID的线程的字段值的地址。
如果您对它的工作方式感兴趣,可以检查例如核心CLR的实现 (搜索GetThreadStaticAddress2方法,也可以查找threads.cpp for GetStaticFieldAddrNoCreate)。Core不使用OS;相反,它维护自己的表,即存储数据的ThreadLocalBlocks和ThreadLocalModules。
还有一个托管Microsoft.Diagnostics.Runtime (CLR MD)实现。它还应该提供对线程本地值的访问。然而,现在它似乎被打破了,就像一条评论说一样
// TODO: Renable when thread statics are fixed.https://stackoverflow.com/questions/53977983
复制相似问题