问题标签 [thread-local-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1284 浏览

c# - 使用线程本地存储的内存泄漏?

几天后,我们的网站明显出现了内存泄漏(> 2Gb /pool)。所以,我在 windbg 上运行了一些命令,终于发现了一些东西:有很多System.LocalDataStoreElement. 在源代码中快速搜索(见下文)后,我发现了一个非常奇怪的类:

所以,我的问题:

  • 在这里使用 Thread.AllocateDataSlot 显然没用,但它可以解释内存泄漏吗?因为经过完整的负载测试(超过 400 000 个请求),我无法重现泄漏。
  • 将 TLS/ThreaStatic 用于 Web 应用程序是否相关?因为在 asp.net 中,我们不控制线程寿命,因为工作线程将执行许多请求。

我还在此处的 MS KB 中发现了一个问题。

总之,一切似乎都在这段代码上,但我无法重现这个问题。

0 投票
3 回答
2546 浏览

c++ - Windows 的线程本地存储是否初始化值?

我在 MSDN 中发现了关于线程本地存储的初始值的矛盾。 这个页面说:

创建线程时,系统会为 TLS 分配一个 LPVOID 值数组,这些值初始化为 NULL。

这让我相信,如果我从一个从未为同一索引调用过 TlsSetValue 的线程中使用有效索引调用 TlsGetValue,那么我应该得到一个空指针。

但是,此页面说:

程序员有责任确保……线程在调用 TlsGetValue 之前调用 TlsSetValue。

这表明您不能依赖从 TlsGetValue 返回的值,除非您确定它已使用 TlsSetValue 显式初始化。

然而,第二页同时通过以下内容强化了初始化为空的行为:

存储在 TLS 槽中的数据可以具有值 0,因为它仍然具有其初始值,或者因为线程调用 TlsSetValue 函数时使用 0。

所以我有两条语句说数据被初始化为 null(或 0),还有一条语句说我必须在读取值之前显式初始化它。实验上,这些值似乎确实被自动初始化为空指针,但我无法知道我是否只是幸运,以及是否总是如此。

我试图避免使用 DLL 来分配 DLL_THREAD_ATTACH。我想按照以下方式进行惰性分配:

这是一种可靠且安全的模式吗?或者我是否必须在尝试读取之前明确初始化每个线程中的插槽?

更新:文档还说TlsAlloc 将已分配索引的插槽归零。因此,程序的另一部分以前是否使用过插槽似乎无关紧要。

0 投票
1 回答
2856 浏览

java - tomcat 的 ThreadLocalLeakPreventionListener 究竟是做什么的?

文档org.apache.catalina.core.ThreadLocalLeakPreventionListener

A在停止LifecycleListener时触发 Executor 池中的线程更新,Context以避免与线程本地相关的内存泄漏。

它如何准确地防止ThreadLocal内存泄漏?上下文停止时是否显式调用ThreadLocal'方法?remove()

据我所知,ThreadLocal是作为哈希映射实现的。映射键是对ThreadLocal实例本身的引用。映射值是线程本地值。

0 投票
1 回答
1006 浏览

c++ - 线程局部指针初始化

在阅读下面链接的 Niklas Frykholm 的非常好的博客文章时,我遇到了一些我无法完全理解的东西。

http://bitsquid.blogspot.nl/2012/01/sensible-error-handling-part-1.html

这段代码让我很困惑:

该代码定义了一个指向字符串数组的线程本地指针,该数组用作简单的堆栈。我不太明白的是如何以跨平台的方式初始化和销毁​​数组?此外,这如何与 dll 边界一起工作?

0 投票
1 回答
1133 浏览

c# - 反复调用 CurrentThread.ManagedThreadId 或将值存储在线程本地存储中?

有没有人有任何见解的实施

就像它是否在进行内核往返一样?我特别想知道从多个线程重复调用它是否比读取一次值更好,将其存储在线程本地存储中,然后使用该值,例如

我今天要测量这两种变体,但我认为事先听到任何想法(或偏见:))会很有趣。

0 投票
1 回答
2536 浏览

c# - 将数据存储在 Thread Local Storage / HttpContext Current Items

将数据存储在 Thread-Local Storage 中,或者HttpContext.Current.Items,哪个更有效......?
这是用于在 Web 应用程序中存储主数据/参数。
在这两种方法中放置数据的代码是:

1. System.Web.HttpContext.Current.Items

2.TLS


谢谢....

0 投票
1 回答
1113 浏览

singleton - Pthread Thread-Local-Singleton,何时释放 TLS Key?

我使用 pthread TLS 实现了一种“线程本地单例”,我想知道在这种情况下我如何(以及何时)可以删除 pthread_key_t,因为就像现在一样,TLS 密钥使用的内存永远不会空闲' d。

其预期用途是让类 A 从 ThreadLocalSingleton<A> 派生,这使 A 成为线程本地单例,假设 A 只有私有构造函数并且 ThreadLocalSingleton<A> 是 A 的朋友。

哦,还有 - 你看到那个实现有什么问题吗?我忽略了什么重要的事情吗?

0 投票
1 回答
569 浏览

windows-phone-8 - 替代 tlsAlloc tlsGetValue 和 tlsSetValue

TLS funcs 是否有任何可能的替代方案。

我正在尝试从 Windows 桌面移植到 Windows Phone 8。

0 投票
1 回答
1534 浏览

spring - 会话超时时的 ThreadLocal 行为

我正在开发一个基于 Java 的网络应用程序,我们使用 ThreadLocal 来跟踪当前登录的用户。现在,通常它工作得很好。但是,每当会话超时,并且系统尝试访问该变量(从 ThreadLocal 数据),它会给出随机值(一些其他登录用户的值)。理想情况下,它应该返回一个空值。我对这里发生的事情感到困惑。

0 投票
2 回答
2245 浏览

c++11 - 使用thread_local时gcc 4.8.1中的内存泄漏?

Valgrind 在以下代码中报告泄漏的块,显然每个线程一个:

编译器版本:

GCC 构建选项:

程序编译选项:

valgrind 版本:

Valgrind 选项:

valgrind 输出的尾部:

构造函数和析构函数为每个线程运行一次:

笔记:

  • 如果更改创建的线程数,则泄漏块数与线程数匹配。
  • 如果 GCC 是这样实现的,那么代码的结构可能允许资源重用(即泄露的块)。
  • 从 valgrind 堆栈跟踪中,thread_local.cc:34 是以下行:thread_local Foo foo;
  • 由于 sleep_for() 调用,程序运行大约需要 10 秒左右。

知道这个内存泄漏是在 GCC 中,是我的配置选项的结果,还是我的程序中的一些错误?