使用ThreadStatic属性的Parallel Extensions。它会泄漏内存吗?

时间:2010-06-12 17:09:07

标签: .net parallel-extensions thread-static

我正在大量使用Parallel Extensions而且我刚刚遇到一种情况,即使用线程本地存储可能是合理的,允许工作线程重用对象。因此我查看了ThreadStatic属性,该属性将静态字段/变量标记为每个线程具有唯一值。

在我看来,将PE与ThreadStatic属性一起使用是不明智的,而不保证PE重用线程。也就是说,如果在某种程度上创建和销毁线程,那么变量(以及它们指向的对象)是否会在线程本地存储中保留一段不确定的时间,从而导致内存泄漏?或者线程存储可能与线程相关联并在线程处理时被丢弃?但是,您仍然可能在池中存在长期存在的线程,并且从线程用于的各种代码中累积线程本地存储。

使用PE获取线程本地存储是否有更好的方法?

三江源。

2 个答案:

答案 0 :(得分:5)

我强烈建议使用正常模式进行线程局部存储,如MSDN article中所述。

使用[ThreadStatic]时,重要的是线程池线程在终止时是否清除TLS变量。 MSDN文档中没有任何建议它没有。它实现起来并不难,只需调用TlsFree()API函数即可。我写了一个小测试应用程序,没有任何泄漏的证据。

答案 1 :(得分:4)

编辑:鉴于汉斯的回答,听起来好像无论如何都要将 清理干净......这只是留下了一点答案:

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