问题标签 [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.
linux - per-cpu 变量的地址
我正在为在 x86-64 SMP 上运行的 2.6.32 版编写一个小型 linux 可加载内核模块。
我的问题是:有没有办法获得内核中声明的每个 CPU 变量的地址偏移量。偏移量是指地址与 percpu 基址的偏移量,它位于 gs 寄存器中。具体来说,我试图找到 current_task 变量的偏移量,它是指向我相信的当前任务的任务结构的指针。
我正在查看具有 get_current() 函数的 arch/x86/include/asm/current.h。此函数使用宏 percpu_read_stable 读取 current_task per-cpu 变量。据我所知 percpu_read_stable 基本上扩展为这样的 asm 例程:
这是在 arch/x86/include/asm/percpu.h 中。我想从我的模块中读取 gs 之后的偏移量。如果我尝试使用 per_cpu_current_task 变量简单地执行 printk,则该模块将被杀死。
感谢您的关注!
java - 使用 ThreadLocals 的 Akka 和 Java 库
使我无法定期使用 Akka(在 Java 中)的原因是我对使用 ThreadLocals 的库感到担忧。
那就是我认为一些 Akka Dispatchers 可能会导致 ThreadLocal 变量被抛在后面,或者一起丢失。因此,显而易见的解决方案是避免使用ThreadLocals,但是有很多库使用它们:Spring、Wro4j、Log4j 等...
ThreadLocals 通常在 Servlet 容器中工作正常。那是因为即使容器有线程池,请求主要是一个同步生命周期,因此通常在请求结束时,像 Spring 和 Wro4J 之类的东西会清理那里的 threadlocals。像 Tomcat 这样的一些容器甚至可以监控线程本地泄漏。
据我了解,Akka 并非如此。
人们如何绕过这个问题?
现在我只是避免使用 Akka 并使用消息队列(如 RabbitMQ 或 ActiveMQ),但我想使用 Akka,因为它涵盖了更广泛的异步问题/解决方案。
我也认为 Netty 有类似的问题,但我相信 Netty 提供了某种 Channel Context 对象,您可以使用它来代替 ThreadLocal,并且理论上一些库可能知道使用它而不是 ThreadLocal。
c++ - 在 boost::thread 中手动清理特定于线程的资源
boost 线程静态库不能与 C++/CLI 代码一起使用,因为它使用线程本地存储回调来清理线程特定的数据。可以通过在构建 boost 库时排除 tss_pe.obj 来禁用这些回调,这允许库在托管代码中使用,但这意味着需要手动清理这些资源。
这些都没有正式记录,但我从各种错误/论坛帖子(例如https://svn.boost.org/trac/boost/ticket/1848 )拼凑而成,此手动清理需要:
- 在退出“不受 boost::thread 管理”的线程时调用 on_thread_exit()。我不清楚这到底意味着什么,或者为什么 Boost 线程会负责清理它没有管理的线程的资源。
- 也可能在 main ( http://lists.boost.org/Archives/boost/2007/11/130440.php )的开头和结尾调用 on_process_enter 和 on_process_exit 。
作为一个以前没有使用过线程本地存储的库的新用户,我想确保我完全理解这些简洁的指导方针。我将使用来自 COM DLL 中非托管代码的 boost 线程,该 DLL 还包含几个托管类。
有人可以通过示例提供更详细的解释,说明在禁用自动清理时我需要调用上述函数以避免资源泄漏的确切情况?
java - dlopen:无法使用静态 TLS 加载更多对象
我有一个大型的混合 java/c++ 应用程序,可以将多个共享库加载到 java 中。它在我的 Ubuntu 12.04 32 位机器上运行良好,但在 Fedora 17 64 位机器上运行时遇到问题。一切都编译得很好,但是当我尝试运行它时,我得到:
任何帮助是极大的赞赏!
更新:我已将其缩小到 PCL(点云库)依赖项的问题。libmylib.so 依赖于 PCL,但如果未安装,也可以在没有 PCL 的情况下进行编译。没有 PCL 的编译工作正常。我正在等待 PCL 社区中的人们回复我,我将根据他们的建议更新此线程。
servlets - 使用 ThreadLocal 存储 HttpServletRequest 和 response
可能重复:
ThreadLocal 将 ServletRequest 和 Response 存储在 servlet 中:为什么?
我有一个 servlet 类,它将信息发送到某个 Delegator 类,该类稍后调用一些业务服务方法。
我需要 Delegator 类方法的当前 HttpServletRequest 和 HttpServletResponse 对象。我没有将其保留为方法签名的一部分,而是考虑将其设置在 servlet 类的 ThreadLocal 变量中,然后从 Delegator 类的方法中的 ThreadLocal 变量中检索它。
下面是示例代码。
您能否建议这种方法是否存在任何可能的问题?
c - C中的_Thread_local存储类说明符?
我在C How to Program 7th一书中读到了一个关于一些新的标准 C 存储类的注释,名为_Thread_local
:
新的 C 标准增加了存储类说明符
_Thread_local
,这超出了本书的范围。
我在谷歌和这里寻找它,但没有出现。有人可以给我一些关于它的链接吗?
c++ - 线程本地和上下文切换
我有一些使用线程本地存储的 C++ 代码,每个线程都有一个可以将数据推入的向量。
我使用 TLS 存储每个线程的索引 ID,这可用于查找将数据推送到哪个向量。然后它执行大量代码,将数据推送到向量中。
我想知道的是,操作系统是否有可能在获取指向线程本地对象的指针后重新安排我的代码在不同的线程上执行。(到目前为止,代码执行得很好,我还没有看到这种情况发生)。但是如果可能的话,这似乎肯定会破坏我的程序,因为现在两个线程可以拥有相同的对象。
假设这是真的,即使对于使用任何复杂性 TLS 的任何代码,这似乎也是一个问题,TLS 是否仅适用于您不获取地址的简单对象?
谢谢!
c - 在自定义 libc 中实现线程本地存储
我正在libc
为非常小的静态链接程序实现一小部分,我认为添加 TLS 支持将是一个很好的学习体验。我使用Ulrich Drepper 的 TLS 文档作为参考。
我设置了两个字符串来尝试一下:
编译器生成以下指令来访问它们:
假设我将 TCB 放在堆栈上的某个位置:
然后将 TLS 区域放在它旁边tls = &tcb - tls_size
。然后我将 FS 寄存器设置为指向fs = tls + tls_size
,并将 TLS 初始化映像复制到tls
.
但是,这不起作用。tls_image
我已通过将 20 个字节写入to 来验证我正确定位了 TLS 初始化映像stdout
。这要么让我相信我错误地放置了 TCB 和/或 TLS 区域,要么我不符合 ABI。
- 我使用
arch_prctl(2)
. 我需要以set_thread_area(2)
某种方式使用吗? - 我没有
dtv
. 我假设这不是必需的,因为我是静态链接的。
关于我做错了什么的任何想法?非常感谢!
c++ - 关于windows中的TLS回调
这是测试代码
使用多线程调试 DLL (/MDd) 构建运行结果:主线程 tls 值 = 1
使用多线程调试 (/MTd) 运行结果构建:主线程 tls 值 = 0
看起来无法捕获使用 MTd 时创建的主线程
为什么 ?
.net - TPL 数据流线程本地数据
有没有一种将线程本地数据传递到 ActionBlock 的好方法,这样如果您在其 DataFlowExecutionOptions 中指定 MaxDegreeOfParallelization 为 > 1,那么执行该操作的每个任务都会有自己的线程本地数据?
这是我的一些代码,可能会阐明我想要做什么:
我希望能够让 ActionBlock 调用我提供的线程本地初始化函数。像这样的东西:
并让它将我的线程本地数据传递给我的 Action 函数: