代码之家  ›  专栏  ›  技术社区  ›  redcalx

使用具有threadstatic属性的并行扩展。它会泄漏内存吗?

  •  6
  • redcalx  · 技术社区  · 14 年前

    我使用的并行扩展相当多,我刚刚遇到一种情况,在这种情况下,使用线程本地存储可能是明智的,允许工作线程重用对象。因此,我研究了threadStatic属性,它将静态字段/变量标记为每个线程具有唯一的值。

    在我看来,如果不保证PE可以重用线程,那么使用具有threadstatic属性的PE是不明智的。也就是说,如果在某种程度上创建和销毁了线程,那么变量(以及它们指向的对象)会在线程本地存储中保留一段不确定的时间,从而导致内存泄漏吗?或者线程存储被绑定到线程上,并在线程被释放时被释放?但是,您仍然有可能在一个长期存在的池中拥有线程,并从线程所使用的各种代码片段中累积线程本地存储。

    有没有更好的方法来用PE获得线程本地存储?

    谢谢你。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Hans Passant    14 年前

    我强烈建议使用普通模式进行线程本地存储,如下面所述 MSDN article .

    当使用[threadstatic]时,重要的是threadpool线程在终止时是否清除TLS变量。在msdn文档中没有任何建议它没有。这并不难实现,它只需要调用tlsfree()api函数。我写了一个小测试程序,没有任何泄漏的迹象。

        2
  •  4
  •   Jon Skeet    14 年前

    编辑:根据汉斯的回答,这听起来像是TLS 不管怎样都要清理…只剩下一点答案:

    您真的没有更好的方法来重用线程中的值吗?如果有两个任务使用相同的线程(一个完成,另一个运行),那么它们真的想要相同的值吗?你是吗 事实上 只是用它来避免在任务中以更可控的方式传播数据?

    推荐文章