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

ios - 如何在 iOS 中进行强大的线程本地存储

pthread_getspecific在一个旨在链接到各种 iOS 应用程序的库中显然得到错误的结果时遇到了一些问题。

我看到苹果写道

Cocoa 和 POSIX 以不同的方式存储线程字典,因此您不能混合和匹配对这两种技术的调用。但是,只要您在线程代码中坚持使用一种技术,最终结果应该是相似的。在 Cocoa 中,您使用 NSThread 对象的 threadDictionary 方法来检索 NSMutableDictionary 对象,您可以在其中添加线程所需的任何键。在 POSIX 中,您使用 pthread_setspecific 和 pthread_getspecific 函数来设置和获取线程的键和值。

这是否意味着当我们不知道调用我们的代码是否已经在使用其中一个时,不能期望 Cocoa 和 POSIX TLS 函数在库代码中工作

在这些情况下,如何稳健地存储和检索线程本地指针?

我们应该使用原生 Darwin TLS 支持 API 来代替 Cocoa 或 POSIX 吗?

0 投票
2 回答
2564 浏览

windows - 线程本地存储/Windows

给定本机代码(C/C++),有人可以解释线程本地存储吗?它只是一个允许线程控制自己变量的生命周期的技巧,还是编译器或硬件有一些隔离/保护措施?

底层平台重要吗?

此外,关于上述内容,普通 TLS 和“光纤安全”TLS 之间有什么区别?

抱歉,我用谷歌搜索,但我只能找到如何使用 TLS(我已经知道),而不是幕后的令人讨厌的细节。

0 投票
1 回答
6396 浏览

c - 如何将变量声明为可移植的线程本地?

C11 引入了_Thread_local存储类说明符,该说明符可以与staticextern存储类说明符结合使用,以将变量声明为线程本地的。__threadGNU C 编译器套件实现了具有相同语义的存储类说明符。

不幸的是,我没有找到任何真正实现_Thread_local关键字的编译器(我尝试过 gcc、clang 和 SUN studio)。我目前使用以下构造来声明关键字thread_local

我知道这可能不适用于 MSVC 和其他编译器。任何人都可以建议我一种更好的方法来声明thread_local它可以在尽可能多的编译器中工作吗?

编辑

Christoph建议 Microsoft Visual C 允许__declspec(thread). 这是更新的宏定义:

0 投票
1 回答
220 浏览

c++ - 在 boost 线程中调用 pthread_getspecific 时访问不正确

我正在开发一个在多个主机应用程序中运行的插件,它使用 boost::thread 库版本 1.53.0 维护自己的线程。

在 Mac 上的特定应用程序中运行我的插件时,调用boost::condition_variable::timed_wait(). 在调用堆栈的顶部是对 的调用pthread_getspecific(),它是从 boost 线程库内部调用的。

如果我用timed_wait()对 的调用替换,则相同的行为:在内部调用boost::this_thread_sleep()时抛出异常。pthread_getspecific()

此应用程序是唯一表现出这种行为的应用程序;如果我在其他主机上运行我的插件,它会按预期工作。

我对 pthreads 没有太多经验,但我认为异常一定是由宿主应用程序设置的某些属性引起的。有没有人对这里可能发生的事情有更好的了解?

谢谢!

0 投票
4 回答
1926 浏览

c++ - 如何在 Windows 上的线程退出时释放 TLS 插槽中的对象?

例如,在多线程程序中:

第一次在任何线程中调用 foo() 将生成一个新的 TLSObject。

我的问题是:如何删除 TLSObject(如果我不使用 boost::thread 和 boost::thread_specific_ptr)?

boost::thread_specific_ptr 可以在线程退出时进行清理工作,但我猜它取决于 boost::thread,而不是普通的操作系统线程,而且速度很慢。

0 投票
1 回答
512 浏览

ubuntu - 线程控制块(TLS 变体 2?)

我目前正在实现一个模拟器来运行 32 位 x86 ELF 文件(使用 GCC 编译),并且我正在尝试理解 TLS(线程本地存储)。

在阅读了有关该主题的 Ulrich Dreppers 论文后,我有以下问题:-

据我了解,%gs:0 引用的内存包含一个 TCB(线程控制块)。但是,我无法准确找到该地址存储的结构。搜索我的内核源代码,我可以找到一些看起来很有希望的结构(tcbhead_t 和其他几个),但我知道在我的系统(Ubuntu 2.6.32-41-generic)上存储在偏移量 0x10 处的值该结构是指向 __kernal_vsyscall 函数的指针,这似乎与我看到的结构不匹配。

如果有人能指出我遗漏的内容,建议一些相关文档,或者指出源代码的正确区域,我将不胜感激。

谢谢,

瑞克。

0 投票
2 回答
4379 浏览

c++ - C++11:GCC 4.8 静态 thread_local std::unique_ptr 未定义参考

我需要为将通过宏访问的每个线程存储一个唯一指针。我想我应该用一个单例和静态 thread_local std::unique_ptr 对象来解决这个问题。这是代码的简化版本:

主文件

耶.hpp

耶.cpp

如果我用 gcc 4.8.1 编译它:

我得到:

我希望我可以从 clang 获得更多信息,但是它与 clang 3.4 完美配合:

运行程序会产生我期望的结果:

我不确定我在这里做错了什么,不可能有静态 thread_local unique_ptr 对象吗?它适用于简单类型,如 int 或“裸”指针。

编辑:

这可能是与http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55800相关的错误

编辑2:

解决方法 1:使用 clang (yay.cpp) 编译一个文件

解决方法 2(可怕且不可移植):首先将 yay.cpp 编译为程序集,添加

到程序集文件,编译到目标文件,与其余文件链接

0 投票
1 回答
285 浏览

c++ - Boost 线程特定指针 get() 方法所花费的大约时间

我们正在使用提升线程特定指针来仅为该特定线程存储一些全局数据。下面是当有人调用 GetInstance() 时我们返回的单例。

我的问题是与普通指针访问相比,获取线程特定指针 (m_tspConnectionManager.get();) 大约需要多长时间?

我使用了下面的代码(我在其中调用了 .get() 方法两次),完成完整功能大约需要 3 秒。

现在,我将上面的代码更改为只调用一次 .get() 方法,大约需要 1.9 秒。

因此,只需不调用 .get() 方法,我就可以看到 1.1 秒的性能提升。我一直在试图了解我们如何获得收益? 注意:这个收益可能是多次调用 GetInstance() 函数的集体收益。只是想在这里理解一个呼叫增益。

0 投票
3 回答
493 浏览

c++ - C++11 认为什么是“线程”?

C++11 有一些线程的概念。例如,它定义了一个新的存储说明符thread_local,并指定对于具有此存储说明符的变量,“每个线程都有一个不同的对象或引用”[basic.stc.thread]。

为此目的,什么被认为是“线程”?是否只有使用标准线程库创建的线程(即由std::thread对象表示的线程)?通过其他方式创建的线程(例如,直接在 Linux 上使用 pthreads)呢?如果我使用一个提供用户空间线程的库怎么办——每个线程都有自己的thread_local对象副本(我真的不知道如何实现)?

如果答案是“它是由实现定义的,出于诸如“之类的目的而被认为是线程thread_local”,有人可以举一个例子来说明一个众所周知的实现如何定义它吗?

0 投票
0 回答
415 浏览

c++ - Boost C++ 线程本地存储向量

我正在为多线程创建一个 tls 向量,并且想知道如何访问向量元素。

基本上我已经创建了这个:


所以我想这更像是一个语法问题,但是如何将向量元素分配给我创建的临时 tls 字符串?


有什么建议么?谢谢 :)