6

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

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

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

谢谢你。

4

2 回答 2

5

我强烈建议使用本MSDN 文章中描述的线程本地存储的正常模式。

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

于 2010-06-12T18:02:23.813 回答
4

编辑:鉴于汉斯的回答,听起来 TLS 实际上无论如何都会被清理掉......这只是留下了这个答案:

你真的没有更好的方法来重用线程中的值吗?如果有两个任务使用同一个线程(一个完成,另一个运行),他们真的想要相同的值吗?您实际上是否只是将其用作避免通过任务以更可控的方式传播数据的一种方式?

于 2010-06-12T17:19:16.887 回答