【问题标题】:Thread-local, class instance-local storage?线程本地,类实例本地存储?
【发布时间】:2011-01-04 21:57:42
【问题描述】:

是否有一种良好的、与平台无关的方法来实现对线程和类实例都是本地的变量,即如果您有 T 线程和 I 类实例,那么您有该变量的 TxI 实例?我使用的是 D 编程语言,版本 2,但一个与语言无关的良好答案也会很有用。

这里有一些限制:

  1. 绝不能要求同步。这排除了将哈希表映射到作为成员变量的变量引用的线程 ID。
  2. 不得保留应该被垃圾回收的引用。这排除了由类实例索引的线程本地静态哈希表。
  3. 为了效率,初始化应该是惰性的。如果线程从不访问给定实例的变量,则永远不应该创建它。

【问题讨论】:

  • D2 没有隐式线程本地存储吗? D1 有 __thread 加上 Tango/druntime 的 TLS 实现 IIRC。
  • D2 具有隐式线程局部变量,但仅适用于全局变量和静态变量。
  • 运行时 TLS 怎么样?可以动态分配吗?

标签: multithreading concurrency thread-local d


【解决方案1】:

不得保留应该被垃圾收集的引用。这排除了由类实例索引的线程本地静态哈希表。

使用带有弱引用键的哈希表。不会阻止垃圾收集,并且会在收集键(类实例)时从哈希表中删除信息。

【讨论】:

  • 不错的主意,只是现在 D 中没有弱引用。
  • @Anon:是的,D 确实有终结器。
  • 然后,假设您可以为每个对象生成唯一的哈希,您仍然可以执行类似的操作。使用唯一的哈希作为哈希映射的键,并在对象终结器中向每个线程发布一个事件以将其从哈希映射中删除。
  • 如果仍有对对象的引用,如何调用终结器?
  • 没有。您使用唯一哈希作为哈希映射的键(因此它没有对对象本身的引用),并让对象在 finalize 中清理它。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多