问题标签 [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.
c# - StructureMap LifeCycle是新的ThreadLocalStorageLifeCycle不是线程本地的吗?
我正在尝试使用 StructureMap 将两个相同类型的实例存储在两个不同的线程中。每个线程都应该有自己的实例:
但是,上述测试失败。另外,使用 LifecycleIs(new ThreadLocalStorage()) 配置,我希望 ConfigureThreadLocalStorageTest1 中的 ObjectFactory.GetInstance() 方法返回 null?
windows - Windows:在我的应用程序加载之前谁在调用 TlsAlloc?
我有一个使用相当数量(不要问!)的线程本地存储变量的应用程序。近十年来,它一直可以毫无问题地运行……直到最近出现了一个惊喜。
客户有一台运行 Windows7(64 位)的笔记本电脑......在他的系统上,TLS 分配失败。(我的问题不完全是这个,但足够接近)。他声称他的系统非常标准。他有一个 ZoneAlarm,但声称其他一切都是库存;把它和一粒盐一起吃)。我如何找出谁或什么在分配其他 TLS 插槽(并有效地让我用尽插槽)?
该应用程序是一个控制台独立应用程序并且相当普通:打开/读/写文件,一些多线程,几乎没有其他任何东西,所以我希望只有基本的 Windows DLL 被积极参与。我知道一些 DLL(甚至是 Windows 的)可能会为基于线程的活动提供服务,因此会分配自己的 TLS 插槽,这没关系。但我不希望任何理智的人分配很多很多。作为我的应用程序启动的一部分(可能是防火墙),是否有其他东西可以将自己插入我的进程空间?
一个典型的进程在启动时应该分配多少个 TLS 插槽?需求从何而来?我可以跟踪 TLS 调用以查看谁在以某种方式分配它们吗?
编辑:2013 年 1 月 1 日: 现在有了一些经验,并让我的工具在启动时报告 TLS 需求,我看到如下内容:
- Win XP 64 8 核 16 Gb RAM:3 个 TLS 变量繁忙
- Windows Vista 32 4 Gb RAM:4 个 TLS 变量繁忙
- Win 7 Pro:4 核 8 Gb RAM:7 TLS 变量繁忙
- Win 7(法语版):2 核,4 GB:最少 25 个 TLS 变量繁忙,在某些配置中更多
我们正在检查 Windows 8,但它的 TLS 需求似乎更高。但究竟是什么导致了两个 Windows 7 系统之间的巨大差异?为什么在我的应用程序开始运行之前需要 TLS 变量(可能是 DLL 存储线程状态) ,特别是考虑到早期版本的 Windows 中不需要?
如果有帮助,我们正在运行一个 32 位应用程序。
c++ - 使用 TLS 减少缓存未命中?
如果我在多线程程序中使用线程本地存储,会减少缓存未命中吗?
编辑:由于每个线程都有自己的内存池,最后访问的内存是否更有可能仍在 CPU 缓存中?
java - Tomcat servlet 中的 ThreadLocal
我遇到了一个问题,即我的生产系统中出现异常,但我真的没有关于谁导致它们的好信息。该人的用户名作为变量存储在他们的 tomcat 会话中,显然我可以在我的doPost
ordoGet
方法中访问它,但除非我将该信息作为参数传递给我的每个业务对象,否则我无权访问会话. 出于显而易见的原因,我想将用户名添加到日志消息中,这样我就知道发生了什么。
所以我的解决方案是做这样的事情
然后在我的帖子/获取中,我可以做到这一点
然后在我的例外情况下,我可能会这样做(人为的,不好的做法示例)
我关心的唯一问题是 Tomcat 将如何管理我的线程。如果他们保留线程怎么办?他们会坚持吗?ThreadLocal 值是否也会持续存在?如果我将整个 Session 存储在 ThreadLocal 中而不仅仅是一个字符串,那将是一个严重的内存泄漏可能性。这也意味着如果有人忘记重新设置(或忘记在完成后清除)用户名/会话在一个持续存在多个请求的线程上,那里可能有陈旧的数据。
称我为愤世嫉俗者,但我不想依赖程序员(甚至,尤其是我自己!)不要忘记为程序的正确性做事。如果我可以对我的代码进行白痴验证,我愿意。这意味着更好地了解 Tomcat 将如何使用线程。
因此,单句形式的问题:
如果我在 Tomcat (7.0.27) 上运行的 web 应用程序中使用 ThreadLocal,我是否会冒 Thread 被用于多个请求的风险,并且来自先前请求的数据被持久化?
我应该指出,即使他们没有回答“Tomcat/ThreadLocal 恶作剧”的确切问题,我也愿意接受其他解决方案,这些解决方案允许我优雅地访问会话变量以进行日志记录。我也愿意就我的解决方案的潜在缺陷发表评论。我有一个业务问题要解决,而且我不接受任何一种解决方案。我只想知道是谁一直在我的产品系统上造成异常:)
c++ - C++11 中的 thread_local 是什么意思?
我对thread_local
C++11 中的描述感到困惑。我的理解是,每个线程在函数中都有唯一的局部变量副本。所有线程都可以访问全局/静态变量(可能使用锁进行同步访问)。并且thread_local
变量对所有线程都是可见的,但只能由定义它们的线程修改?这是对的吗?
c++ - C++11:非平凡线程局部静态变量?
我有一个 X 类:
我想做这个:
(实际上我使用的是 gcc,所以关键字是“__thread”)
但我不能,因为你只能拥有微不足道的 thread_locals。
最好的解决方法是什么?
如果我这样做:
然后:
- 线程退出时不会调用析构函数
- 不必要的动态内存分配。
更新:
这是我到目前为止所拥有的:
这解决了动态内存分配问题。我只需要添加线程清理处理程序。有没有一种机制可以用 pthreads 做到这一点?
c++ - 如何在 C++ 中初始化线程局部变量?
可能重复:
gcc 中的 C++11 thread_local - 替代方案
有没有办法使用 GCC 的 __thread 完全模拟 thread_local?
我想使用 c++11thread_local
来创建和使用 thread_local 变量,但由于 gcc 尚不支持它,我正在使用 gcc 特定__thread
的 . 我声明变量的方式是
当我编译它时,我收到一个错误,例如
如何正确地做到这一点?
PS:gcc版本:4.6.3
c++ - ucontext 和线程本地存储
我要问的平台是linux。我说的线程本地存储is pthread_xxx
or __thread
in gcc。
我想在我的程序中使用 ucontext 的东西,即 makecontext、swapcontext 等。所以我的问题是,它如何与线程本地存储一起工作?更具体地说,如果我使用 swapcontext 或 setcontext 切换到另一个纤程,线程本地存储是否也会发生变化,或者线程本地存储不是上下文的一部分?
另一个问题:如果 TLS 将由setcontext
/更改swapcontext
,那么无论我如何更改上下文,是否有任何东西会粘在线程上?另一方面,如果 TLS 会坚持上下文,那么是否有任何东西会坚持线程并且不会被 setcontext/swapcontext 更改?
根据http://en.wikipedia.org/wiki/Fiber_(computer_science),Windows 平台确实有线程本地存储和光纤本地存储。
spring-webflow-2 - requestcontextholder 并发访问
我在 weblogic 服务器上运行的 spring webflow 应用程序中使用以下代码。
RequestContextHolder.getRequestContext()
.getExternalContext().getNativeRequest()).getSession()
我知道RequestContextHolder
用于ThreadLocal
存储requestContext
启动和恢复期间的步骤。
现在的问题是一个线程可以访问requestContext
其他线程的任何远程可能性(可能是因为线程被weblogic重用或由于其他原因)?
c - 每个 cpu 架构的真正 ELF TLS ABI 要求是什么?
Ulrich Drepper关于线程本地存储的论文概述了几种不同 cpu 架构的 TLS ABI,但我发现它不足以作为实现 TLS 的基础,原因有两个:
- 它省略了一些重要的拱门,如 ARM、MIPS 等(同时包括一堆完全不相关的拱门,如安腾)
- 更重要的是,它将很多实现细节与 ABI 混合在一起,因此很难区分互操作性需要哪些属性,哪些只是他实现的方面。
例如,i386 的唯一实际 ABI 要求是:
%gs:0
指向一个指向自身的指针。- 主可执行文件的 TLS 段(如果有)必须位于距此地址的固定(通过链接器,为负)偏移处。
- 初始加载的库的所有其他 TLS 段必须有一个运行时常量(即每个线程相同,但在不同的程序运行中不一定相同)相对于该地址的偏移量(并且动态链接器必须能够用这些偏移量)。
___tls_get_addr
并且__tls_get_addr
函数必须以正确的语义存在,以查找任意 TLS 段。
特别是,DTV 的存在或布局不是ABI 的一部分,除主程序之外的 TLS 段的排序/布局也不是。
似乎任何使用“TLS 变体 II”的拱门都大致具有上述 ABI 要求。但是我根本不太了解“TLS 变体 I”的要求,而且从阅读资料(在 uClibc 和 glibc 中)看来,甚至可能有几个“变体 I”的变体。
有没有更好的文档我应该查看,或者熟悉 TLS 工作原理的人可以向我解释 ABI 要求吗?