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

multithreading - 为什么线程本地存储这么慢?

我正在为 D 编程语言开发一个自定义标记释放样式的内存分配器,它通过从线程本地区域分配来工作。与其他相同的单线程代码版本相比,线程本地存储瓶颈似乎导致从这些区域分配内存的速度大幅下降(~50%),即使在将我的代码设计为每次分配只有一个 TLS 查找之后/解除分配。这是基于在循环中多次分配/释放内存,我试图弄清楚它是否是我的基准测试方法的产物。我的理解是线程本地存储基本上应该只涉及通过额外的间接层访问某些东西,类似于通过指针访问变量。这是不正确的吗?线程本地存储通常有多少开销?

注意:虽然我提到了 D,但我也对不特定于 D 的一般答案感兴趣,因为如果 D 的线程本地存储实现比最佳实现慢,它可能会改进。

0 投票
3 回答
5595 浏览

c++ - 线程局部单例

我想创建一个在使用它的每个线程中实例化一次的单例类。我想将实例指针存储在 TLS 插槽中。我想出了以下解决方案,但我不确定当涉及线程本地存储时,多线程访问单格顿工厂是否有任何特殊考虑。也许还有更好的解决方案来实现线程本地单例。

Tls* 函数当然是特定于 win32 的,但可移植性不是这里的主要问题。您对其他平台的想法仍然很有价值。

主要编辑:我最初询问过在这种情况下使用双重检查锁定。然而,正如DavidK指出的那样,无论如何,单例都是基于每个线程创建的。

剩下的两个问题是:

  1. 是否适合回复 TlsGetValue/TlsSetValue 以确保每个线程获得一个实例并且每个线程只创建一次实例?

  2. 是否可以注册一个回调,允许我在该线程完成时清理与特定线程关联的实例?

0 投票
5 回答
68438 浏览

python - Python中的线程本地存储

如何在 Python 中使用线程本地存储?

有关的

0 投票
4 回答
492 浏览

static - 线程本地存储在其他地方使用?

除了将全局变量和静态变量设置为线程本地之外,线程本地存储是否在其他任何地方使用?它在我们编写的任何新代码中是否有用?

0 投票
2 回答
3064 浏览

thread-local-storage - 线程本地存储macosx

http://developer.apple.com/mac/library/documentation/DeveloperTools/gcc-4.0.1/gcc/Thread_002dLocal.html

文档 __thread

但是我的 g++ 抱怨我的拱门不支持 __thread(Macbookpro 上的 Leopard)。

为什么是这样?我该如何解决?

0 投票
1 回答
19941 浏览

linux - Linux的线程本地存储实现

“foo”实际上是如何解决的?编译器是否用函数调用静默替换“foo”的每个实例?“foo”是否存储在相对于堆栈底部的某个位置,编译器将其存储为“嘿,对于每个线程,在堆栈底部附近有这个空间,而 foo 存储为'offset x from the bottom of stack' “?

0 投票
1 回答
1384 浏览

c++ - 线程本地内存,使用 std::string 的 c 样式暂存内存的内部缓冲区

我正在使用协议缓冲区OpensSSL生成 HMAC,然后 CBC 加密这两个字段以混淆会话 cookie——类似的 Kerberos 令牌。

Protocol Buffers 的 API 与 std::strings 通信,并具有缓冲区缓存机制;我利用缓存机制,将同一线程中的连续调用放在线程本地内存中;此外,OpenSSL HMAC 和 EVP CTX 也被放置在同一个线程本地内存结构中(请参阅这个问题,了解为什么我使用线程本地内存以及即使使用单个线程也能实现大量加速)。

这些 cookie 字符串的生成和反序列化“我的算法”使用中介void *s 和std::strings,并且由于 Protocol Buffers 具有内部内存保留机制,我希望这些特征用于“我的算法”。

那么如何实现一个通用的暂存器呢?我对 std::string 对象的 rdbuf(streambuf - strinbuf ??) 了解不多。我大概需要将它增长到执行“我的算法”期间遇到的最低常见大小。想法?

我想我的问题是:“字符串的内部缓冲区是否可重用,如果是,如何?”

编辑(新问题):

在 Vlad 的帖子之后,我似乎确实需要一个 std::string 以及一个 void * c 样式的暂存缓冲区。那么我的问题是:流行的 stl 的字符串实现在不需要时会保留内存吗?(我的需求可能会保持在 128 字节到 10 KB 之间)。

0 投票
1 回答
432 浏览

c++ - 仅在 NetBSD 上的线程本地存储段错误?

尝试运行C++ 程序时,我遇到了似乎特定于 NetBSD 的分段错误。Bert Hubert 编写了简单的测试程序(在此消息的末尾),事实上,它只在 NetBSD 上崩溃。

在其他 Unix 上,它工作正常。使用 C++ 线程本地存储的 NetBSD 中是否存在已知问题?

0 投票
2 回答
1031 浏览

c++ - C++ TLS,出了点问题

我正在学习线程本地存储...(TLS)这是我的 TLS Alloc 代码:

现在我尝试从 TLS 中获取值:(在另一个 CPP 文件中)

但是数据包含 0,我在其中放了 5.... 我做错了什么?

0 投票
2 回答
1648 浏览

c++ - 无论如何在 Win32 API 中动态释放线程本地存储?

我需要在跨平台项目中使用线程本地存储。在 *IX 下,我使用 pthreads 并且可以避免内存泄漏,这要归功于作为第二个参数传递给 的好的析构函数指针pthread_key_create,但在 WindowsTlsAlloc中没有这样的东西。我也找不到在线程退出时调用任何函数的一般位置(否则我会自制一些在退出时调用的函数指针列表)。

就目前而言,我基本上有一种情况,为了实际使用线程本地存储,我需要在堆上分配我自己的空间并将指针传递给TlsSetValue,但是如果线程退出......我无法确保内存被释放(除了有人在线程函数末尾显式调用TlsGetValuedelete/// etc freeHeapFree

有人知道更好的方法吗?