问题标签 [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 投票
5 回答
1451 浏览

multithreading - 汇编 - 线程安全的局部变量

我正在尝试在汇编程序中使用线程安全的局部变量。我在网上搜索过,但我没有找到任何简单的东西。

我目前正在使用 GCC 汇编器,因为该程序是 C 代码和汇编的混合体,但最终程序将包含多平台/调用约定的代码。

现在,我已经使用.lcomm伪操作声明了我的变量。据我了解,这些变量将放在该.bss部分中。所以我想它们将被所有线程共享。

有没有办法在程序集中直接使用一种 TLS 变量,或者我应该使用特定于平台的实现,比如在 Windows 上pthread还是__declspec在 Windows 上?

希望它足够清楚。不要犹豫,询问是否需要更多信息。

谢谢大家,

编辑

这是有问题的代码:

基本上,它用于将调用重定向到 C 函数。

C原型是:

它需要一个函数指针作为第一个参数,因此是callq *%rdi, 因为我正在使用系统 V ABI 进行测试。

汇编代码非常简单,我想保持这种方式,这样它就可以很容易地维护。

问题是:如何使stack0stack1变量线程安全。

0 投票
5 回答
6805 浏览

multithreading - 为什么要使用线程本地存储(TlsAlloc、TlsGetValue、ets)而不是局部变量

我的问题是为什么在线程函数中使用 TLS 机制而不仅仅是局部变量?您能否提供一些很好的示例,或者 TLS 相对于本地变量的优势是什么?谢谢你,马特乌斯

0 投票
1 回答
2620 浏览

c# - 线程本地存储内存使用

.NET 中有没有办法确定线程本地存储占用的内存量?

具体来说,我希望找到 ThreadStatic 对象使用的内存量以及分配给 Thread 数据槽中的对象的内存量(例如,通过调用 Thread.SetData)。

澄清:

线程本地存储:http: //msdn.microsoft.com/en-us/library/6sby1byh.aspx

线程本地存储:线程相关的静态字段和数据槽 http://msdn.microsoft.com/en-us/library/6sby1byh.aspx

0 投票
1 回答
6074 浏览

c++ - 线程本地存储和 iOS

我的理解是 iOS 不支持__thread. 显然,有一种方法可以使用pthread_setspecific. 但是,是否已经有一个模板类实现了这个功能?

我想重新发明轮子,尤其是因为它不会是一段简单的代码。

任何链接将不胜感激!

干杯

0 投票
1 回答
598 浏览

java - 线程本地JDK 中的文档

JDK 1.6 文档显示了一个关于如何使用LocalThread<T>. 我在这里复制并粘贴它:

例如,下面的类生成每个线程本地的唯一标识符。线程的 id 在它第一次调用时被分配,UniqueThreadIdGenerator.getCurrentThreadId()并且在随后的调用中保持不变。

我的问题是:

当多个线程调用UniqueThreadIdGenerator.getCurrentThreadId()它时,它只返回 0,因为没有初始化。不应该是这样的:

现在在第一次调用之后,它会初始化变量。

0 投票
3 回答
3306 浏览

.net - 使用 TPL 时如何管理线程本地存储 (TLS)?

我想将日志记录上下文信息存储在 TLS 中,以便我可以在入口点设置一个值,并使该值在所有生成的堆栈中都可用。这很好用,但我也使用 TPL 和 ThreadPool。那么问题就变成了如何将 TLS 数据迁移到其他线程。我可以自己做这一切,但是我失去了像 Parallel.For 这样的好方法。

使用 TPL 时有什么方法可以复制 TLS 吗?当 C# 获得 await 功能时,这也将适用于它。

谢谢,埃里克

0 投票
2 回答
1683 浏览

python - 在 python 程序中通过 ctypes 将共享库与线程本地存储一起使用时的内存泄漏

我正在使用ctypespython 中的模块来加载一个共享的 c-library ,其中包含线程本地存储。它是一个历史悠久的大型 c 库,我们正在努力使线程安全。该库包含许多全局变量和静态变量,因此我们对线程安全的初始策略是使用线程本地存储。我们希望我们的库独立于平台,并且一直在 win32、win64 和 64 位 Ubuntu 上编译和测试线程安全。从纯粹的 c 进程来看,似乎没有任何问题。

然而,在 win32 和 Ubuntu 上的 python(2.6 和 2.7)中,我们看到了内存泄漏。当 python 线程终止时,似乎没有正确释放线程本地存储。或者至少以某种方式,python 进程没有“意识到”内存已被释放。实际上,在 win32 上的 ac#-program 中也看到了同样的问题,但在我们的 win64 服务器测试机器上不存在(也运行 python 2.7)。

这个问题可以通过一个简单的玩具示例来重现,如下所示:

创建一个包含(linux/unix删除时__declspec(dllexport))的 c 文件:

MINGW在 linux 上的 windows/gcc 上编译 wit ,如:

gcc -o leaky.dll(或leaky.so-shared the_file.c

在 Windows 上,我们可以使用 Visual Studio 编译,替换__thread__declspec(thread). 但是在 win32 上(我相信直到 winXP),如果要在运行时使用LoadLibrary.

现在创建一个 python 程序,如:

这足以重现错误。显式导入垃圾收集器,collect gc.collect()在启动每个新线程时执行 a 无济于事。

有一段时间我认为问题与不兼容的运行时有关(python 使用 Visual Studio 编译,我的库使用MINGW. 但问题也出现在 Ubuntu 上,但不在 win64 服务器上,即使库是使用MINGW.

希望任何人都可以提供帮助!

干杯,Simon Kokkendorff,丹麦国家调查局和地籍局。

0 投票
3 回答
443 浏览

visual-c++ - __addgs* 是如何使用的,GS 是什么?

在微软的网站上可以找到一些细节

内在功能。据说offset

从 GS 开头的偏移量。我假设GS指的是处理器寄存器。

GS与堆栈有什么关系(如果有的话)?或者,我如何计算相对于GS的偏移量?

(而且,是否有任何与此和特定调用约定相关的“陷阱”,例如__fastcall?)

0 投票
2 回答
4652 浏览

c++ - thread_local 的成本

现在 C++ 正在将thread_local存储添加为一种语言功能,我想知道一些事情:

  1. 可能的成本thead_local是多少?
    • 在记忆中?
    • 对于读写操作?
  2. 与此相关:操作系统通常如何实现这一点?似乎任何声明的东西thread_local都必须为创建的每个线程提供特定于线程的存储空间。
0 投票
1 回答
1135 浏览

c# - 使用已知种子创建 ThreadLocal 随机生成器

我正在努力寻找一种方法让每个线程都有一个随机数生成器,同时确保在重新运行程序时产生相同的数字。

我现在做的是这样的:

因为为创建“数据”列表的随机生成器提供了一个种子,并且为计算中使用的随机生成器提供了一个基于正在处理的数字的哈希码的种子,所以结果是可重复的。不管线程的数量和它们被实例化的顺序。

我想知道是否可以为每个线程仅实例化一个随机生成器。以下代码似乎可以实现这一点,但由于不再为随机生成器提供(可重现的)种子,因此结果不可重复。

谁能想到一个很好的解决这个问题的方法?