【问题标题】:How to get ThreadStatic value of another thread?如何获取另一个线程的 ThreadStatic 值?
【发布时间】:2015-02-19 11:49:17
【问题描述】:

是否有可能给定Thread 引用以获取该线程的ThreadStatic 值?

【问题讨论】:

  • [ThreadStatic] 数据是线程本地的,正是为了防止多个线程访问一个值时出现问题。允许跨线程访问会破坏目的。你想达到什么目的?
  • @JeroenMostert 我希望线程将其当前状态存储在 ThreadStatic 字段中,并记录以定期转储工作线程的状态。
  • 我能闻到XYProblem 的味道。如果你想访问另一个线程的数据,那为什么是[ThreadStatic]
  • @Poma,然后让它更加面向对象,让你的线程在记录器中注册并传递它的状态(定期?)。 “告诉,不要问”规则在这里。
  • 也许我理解错了,但是如果你想让记录器显示一组线程的状态,为什么不把它们保存在 List 并检查 State 属性每个线程?我以前使用过它并且它有效,但也许它不是正确的方法或不完全是你想要的东西。

标签: c# .net multithreading


【解决方案1】:

不,这是不可能的。与像这样的属性一样,[ThreadStatic] 属性被抖动识别。它生成对 CLR 的调用,以获取指向类的线程本地存储的指针。这个辅助方法有多个版本,基本的一个是JIT_GetSharedGCThreadStaticBase()。但是对于泛型类来说,它变得更加复杂,例如,它可以有多个基于类型参数的静态变量。辅助函数接受两个非显而易见的参数,模块 ID 和类 ID。这些 ID 取决于加载代码的 AppDomain。

长话短说,你没有机会进行同样的调用,帮助方法甚至不获取线程 ID,它是由调用上下文隐含的。

您可以使用Thread.AllocateNamedDataSlot() 将任意数据挂起线程。但请注意,它是静态方法,也不需要线程 ID,它再次基于调用上下文。

这都是故意的。线程本地存储的一个非常好的特性是它始终是线程安全的。允许从另一个线程访问它的后门将完全破坏该功能。如果你想这样做,那应该会让你非常担心。例如,您可以使用由 ManagedThreadId 键入的您自己的查找表。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多