问题标签 [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 - 自己实现 pthread 键
我的一个现有代码使用了一些线程特定的键。我打算现在扩展此代码,这需要创建越来越多的此类键。但是 pthread 每个进程支持大约 1024 个密钥,因为在此限制之后没有创建密钥,这给我带来了问题。关于如何在不使用键的 pthread 实现的情况下实现最佳相同功能的任何建议?
python - 在 Cython 中分配中间多维数组而不获取 GIL
我正在尝试使用 Cython 来并行化涉及生成中间多维数组的昂贵操作。
以下非常简化的代码说明了我正在尝试做的事情:
编译失败似乎至少有两个原因:
基于 的输出
cython -a
,此处创建类型化内存视图:似乎涉及 Python API 调用,因此我无法释放 GIL 以允许外部循环并行运行。
我的印象是类型化的内存视图不是 Python 对象,因此子进程应该能够在不首先获取 GIL 的情况下创建它们。是这样吗?
2.即使我替换prange(m, nogil=True)
为 normal range(m)
,Cython 似乎仍然不喜欢cdef
内部循环中存在 a :
更新
事实证明,第二个问题很容易通过移动来解决
在for
循环之外,只是分配
循环内。不过,我仍然不完全理解为什么这是必要的。
现在,如果我尝试使用prange
我会遇到以下编译错误:
python - Python Threading 中什么是自动线程本地的,什么不是自动线程本地的?
我很难理解 Python 线程,特别是因为文档在某些时候明确告诉您 RTFS,而不是友好地包含相关信息。我承认我没有资格阅读线程模块。我见过很多非常简单的例子,但它们都使用全局变量,这很令人反感,让我想知道是否有人真的知道何时何地需要使用它们,而不是仅仅为了方便。
特别是,我想知道:
- 在
threading.Thread(target=x)
, 是x
共享的还是私有的?每个线程都有自己的堆栈,还是所有线程同时使用相同的上下文? - 将可变变量传递给线程的首选方法是什么?不可变的显然已经通过了
Thread(args=[],kwargs={})
,这就是所有示例所涵盖的内容。如果它是全球性的,我将不得不捏着鼻子使用它,但似乎必须有更好的方法。我想我可以将所有内容包装在一个类中,然后将实例传入,但最好也指向常规变量。 - 我什么时候需要
threading.local()
?在x
上面? - 正如许多示例所示,我是否必须对 Thread 进行子类化才能更新数据?
我习惯于 Win32 线程和 pthreads,它在文档中明确列出了与线程的不同用途共享和不共享的内容。这些都是相当低级的,如果可能的话,我想避免 _thread 是pythonic。
我不确定它是否相关,但我正在尝试使用 OpenMP 风格的线程来掌握它 - 使用队列和一些线程同时运行 for 循环。使用全局变量和锁很容易,但现在我想确定范围以更好地使用锁。
multithreading - C++11 中的动态 TLS
我正在编写一个 C++11 类 Foo,我想为每个实例提供其自己的 Bar 类型的线程本地存储。也就是说,我希望为每个线程和每个 Foo 实例分配一个 Bar。
如果我使用 pthreads,Foo 将有一个 pthread_key_t 类型的非静态成员,Foo 的构造函数将使用 pthread_key_create() 对其进行初始化,而 Foo 的析构函数将使用 pthread_key_delete() 释放。或者,如果我只为 Microsoft Windows 编写代码,我可以用 TlsAlloc() 和 TlsFree() 做类似的事情。或者,如果我使用的是 Boost.Thread,Foo 将有一个 boost::thread_specific_ptr 类型的非静态成员。
然而,实际上,我正在尝试编写可移植的 C++11。C++11 的thread_local
关键字不适用于非静态数据成员。因此,如果您希望每个线程有一个 Bar,但如果您希望每个 Foo 的每个线程有一个 Bar,则不是这样。
据我所知,我需要定义一个从 Foos 到 Bars 的线程本地映射,然后处理如何在 Foo 被销毁时进行适当清理的问题。但在我开始之前,我在这里发帖希望有人会阻止我并说“有一个更简单的方法”。
(顺便说一句,我不使用 pthread_key_create() 或 boost::thread_specific_ptr 的原因是,如果我理解正确,他们假设所有线程都将分别使用 pthreads 或 Boost.Thread 生成。我不想关于我的代码的用户将如何产生线程的任何假设。)
c++ - 在非增强线程中使用 boost::thread_specific_ptr
我正在阅读文档部分boost::thread_specific_ptr
,并尝试解析这一段:
注意:在某些平台上,不会对使用平台的本机 API 创建的线程执行线程特定数据的清理。在那些平台上,此类清理仅针对以 boost::thread 启动的线程进行,除非从该线程手动调用 boost::on_thread_exit()。
首先,这可能是一个迂腐的观点:我认为他们的意思是说boost::this_thread::at_thread_exit()
而不是boost::on_thread_exit()
. 否则我真的迷路了。
更重要的是,线程到底需要做什么?它是否足以将一些无操作函数传递给 at_thread_exit(),还是需要传递其他东西?
(这个话题在这里的评论中讨论过,但我仍然不确定我需要做什么。)
(背景故事:我正在寻找解决我今天早些时候提出的问题的方法)。
python - Django、语言环境和线程本地化
Django 使用线程本地化进行本地化是否存在问题(django.utils.translation.activate
例如,请参阅),尤其是在特定网络服务器上运行时?
因此,对于 django 项目可以运行的服务器的选择是否有限制?
顺便说一句,我很惊讶地在某些地方读到,当 Django 已经在自己做这件事时,使用线程局部变量对 Django 来说不是一个好主意......
更新(重新措辞以与Why is using thread locals in Django bad?有所不同? ):
对于运行 Django 的某些 Web 服务器,当前实现是否“有风险”?Django 会发展成与线程无关的东西吗?
c++ - thread_specific_ptr 多线程混淆
// 代码片段 1
// 代码片段 2
在代码片段 1 中,两个指针是相同的。这不是预期的。在代码片段 2 中,将 StreamThreadSpecificPtr 初始化为 NULL,一切都很好。
你能帮忙找出这个困惑的答案吗?非常感谢。
c++ - C ++ 11 thread_local变量是否自动静态?
这两个代码段之间是否有区别:
和
背景故事:最初我有一个静态向量 V(用于保存一些中间值,每次进入函数时都会被清除)和一个单线程程序。我想把程序变成一个多线程的程序,所以我必须以某种方式摆脱这个静态修饰符。我的想法是把每一个静态都变成thread_local,而不用担心别的?这种方法会适得其反吗?
multithreading - 在线程结束时删除 thread_specific_ptr 数据的问题
我使用带有 boost 的线程本地存储。我有一个全局变量:
我有以下类,它封装了一个 boost::thread 对象并包含一个附加数据对象:
编译时我没有收到任何错误。但是在运行时,当工作函数退出并且线程结束时,我得到一个“glibc ... free ... invalid pointer”错误。
我想这是因为根据 boost 文档,thread_specific_ptr 试图在线程结束时删除它指向的对象。但我不明白如何解决这个问题。
linux - 有没有办法确定 Linux 上的库使用的线程本地存储模型
有没有办法在 Linux 上查询共享库的 TLS 模型?(例如使用 ldd 或其他工具)。
我在使用“initial-exec”模型加载太多库时遇到问题,并且想确定哪些第三方库使用此模型(因此我可以释放一些插槽,例如通过静态链接)。
这会导致错误:
看到这个问题。