问题标签 [thread-specific-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.
multithreading - 可移植线程特定存储机制的命名方案如何生成线程相关唯一标识符?
一个可移植的线程特定存储引用/身份机制,其中 boost/thread/tss.hpp 是一个实例,需要一种为其自身生成唯一密钥的方法。该键在线程范围内是唯一的,随后用于检索它所引用的对象。这种机制用于以线程中立方式编写的代码中。
既然 boost 是这个概念的一个可移植的例子,那么这种机制具体是如何工作的呢?
c++ - 是否可以*安全地*从函数中返回 TCHAR*?
我创建了一个将所有事件通知代码转换为字符串的函数。真的很简单的东西。
我有一堆像
和我的功能
没什么大不了。我花了5分钟拼凑起来。
...但我根本不相信我已经获得了所有可能的值,所以如果没有找到匹配项,我希望默认返回类似“意外通知代码 (7410)”的内容。
不幸的是,我无论如何都想不出返回一个有效指针,而不强制调用者删除字符串的内存......这不仅令人讨厌,而且与其他返回值的简单性相冲突。
因此,如果不将返回值更改为用户传入缓冲区和字符串长度的参数,我想不出任何方法来做到这一点。这将使我的功能看起来像
我真的不想那样做。一定会有更好的办法。
在那儿?
在中断了 10 年之后我又回到了 C++,所以如果这很明显,请不要小看我忽略了它是有原因的。
multithreading - 如何正确使用线程特定的数据
我正在使用 pthread 编程。我需要一个全局变量,它对不同的线程具有不同的值。并且线程将使用相同的函数来处理这个变量,例如改变它的值。如果一个线程改变了它的值,其他线程中的值不会改变。所以我尝试使用线程特定的数据,并写了一个例子。我需要将 pthread 操作包装在函数中。例如:setspecific()、changedata、printdata()、create_key()、delete_key() 等。
我创建了两个线程。当我让一个线程休眠 2 秒时。我得到正确答案。
当我评论 /* sleep(2); */ ,我得到不正确的答案。
我想在没有线程的情况下获得正确的结果。一个线程不应该等待另一个线程完成调用 pthread_setspecific() ,对吗?我该怎么办?感谢您的考虑。我将 struct_data 定义为全局变量是否正确?任何人都可以帮助我吗?
c++ - 线程特定数据与线程本地存储
我已经阅读了 Kerrisk 的The Linux Programming Interface: A Linux and UNIX System Programming Handbook,第 31 章关于线程。本章包括线程特定数据(第 31.3.4 节)和线程本地存储(第 31.4 节)。第 663-669 页涵盖了这些主题。
线程特定数据(pthread_key_create
、pthread_setspecific
、pthread_getspecific
和朋友)看起来更强大,但似乎使用起来有点麻烦,并且似乎更频繁地使用内存管理器。
线程本地存储(__thread
在静态和全局声明上)看起来不太强大,因为它受限于编译时间,但它似乎更易于使用,并且在运行时似乎远离内存管理器。
pthread_key_create
我对运行时内存管理器的看法可能是错误的,因为当它遇到__thread
变量时可能会有在后台调用的代码。
Kerrisk 没有提供两种策略的比较/对比,他也没有就在特定情况下何时使用哪种策略提出建议。
为问题添加上下文:我正在评估第 3 方库。该库使用全局变量,不使用锁定,我想在多线程程序中使用它。该程序使用线程来最小化网络延迟。
有没有一个不折不扣的赢家?或者是否有不同的场景需要使用其中一种?
c++ - pthread_key_create 析构函数没有被调用
根据pthread_key_create手册页,我们可以关联一个析构函数,以便在线程关闭时调用。我的问题是我注册的析构函数没有被调用。我的代码要点如下。
知道什么可能会阻止调用此析构函数吗?我现在也在使用 atexit() 在主线程中进行一些清理。是否有可能干扰调用析构函数?我也尝试删除它。仍然没有工作。我也不清楚我是否应该将主线程作为一个单独的案例与 atexit 一起处理。(顺便说一句,必须使用 atexit,因为我需要在应用程序退出时进行一些特定于应用程序的清理)
c++ - 如何迭代提升线程特定的指针
我有一个多线程应用程序。每个线程在自己的本地存储中初始化一个结构数据类型。一些元素被添加到结构类型变量内的向量中。在程序结束时,我想遍历这些线程本地存储并将所有结果加在一起。如何遍历线程特定的指针,以便将多线程的所有结果加在一起?
提前致谢。
例子:
c - 我可以从当前线程中保存一个值吗?
我在编写 C 程序时遇到了一些困惑。
我的场景有 2 个线程,但它们是串行运行的,所以一次只有一个线程。我想在我的第一个线程中保存一个参数,我想在我的第二个线程中获取它。(这里是线程)
那么有没有办法意识到这一点?公共静态参数在线程结束时会被回收,因为它属于当前线程。我想在当前进程而不是线程中保存一个值或指针,以便我可以将它附加到我的下一个线程中......
有没有可能的方法来实现这一点?
非常感谢!
c++ - C++ 线程本地存储 - 在不同的编译单元中使用相同的名称
假设我们在某个编译单元中有以下代码,最终在 Linux (g++ 4.9) 上编译为共享库
所以这被编译成 .so 并且它不会导出这个符号(使用隐藏的可见性)。
现在,一个特定的应用程序具有正在使用的同一段代码。即相同的 cpp 编译单元与此应用程序链接,它也访问上述共享库。
问题 - 这 2 个 myobj 实例是否位于 TLS 中的 2 个不同地址中?我认为是的,但我看到可能与上述配置有关的问题。
c - “线程本地存储”和“线程特定存储”之间的区别
使用 dedicated 关键字声明线程局部变量有什么区别:
并使用特定tss_
的功能集:
据我了解,_Thread_local
关键字声明了一个具有线程存储持续时间的变量,而tss_
函数集则将一个键返回给调用线程。然后可以使用此键访问一些可以根据需要分配的全局堆内存,并且该指针将仅对该线程可用,对吗?