Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 为什么使用线程本地存储(TlsAlloc、TlsGetValue、ets)而不是本地变量_Multithreading_Storage_Local_Thread Local Storage - Fatal编程技术网

Multithreading 为什么使用线程本地存储(TlsAlloc、TlsGetValue、ets)而不是本地变量

Multithreading 为什么使用线程本地存储(TlsAlloc、TlsGetValue、ets)而不是本地变量,multithreading,storage,local,thread-local-storage,Multithreading,Storage,Local,Thread Local Storage,我的问题是为什么在线程函数中使用TLS机制而不仅仅是局部变量?你能提供一些好的例子吗,或者TLS比本地VAR有什么优势? 非常感谢。 Mateusz线程本地存储可用于在每个线程的基础上模拟全局或静态变量。“普通”局部变量不能。TLS有助于处理用户会话上下文信息等特定于线程的信息,但可能用于各种不相关的方法。在这种情况下,TLS比在调用堆栈上下传递信息更方便。如果可以使用局部变量,那么就这样做,并且始终可以使用局部变量。只有在万不得已的情况下,才应该使用线程本地存储,它与全局变量几乎有着相同的缺点

我的问题是为什么在线程函数中使用TLS机制而不仅仅是局部变量?你能提供一些好的例子吗,或者TLS比本地VAR有什么优势? 非常感谢。
Mateusz

线程本地存储可用于在每个线程的基础上模拟全局或静态变量。“普通”局部变量不能。TLS有助于处理用户会话上下文信息等特定于线程的信息,但可能用于各种不相关的方法。在这种情况下,TLS比在调用堆栈上下传递信息更方便。

如果可以使用局部变量,那么就这样做,并且始终可以使用局部变量。只有在万不得已的情况下,才应该使用线程本地存储,它与全局变量几乎有着相同的缺点。虽然您正在寻找使用线程本地存储的原因,但实际上最佳实践是寻找避免这种情况的方法

以下是Intel关于使用线程本地存储减少同步的好链接:

我知道一个使用TLS的非常好的例子。当您实现LIBC或将其中一个LIBC变体移植到新平台时,您需要某种程度上“errno”变量(在单线程平台上,它只是extern int errno)对于每个线程都是唯一的。LIBC函数只是将其存储在当前线程的TLS中,而对errno的调用只是从TLS中读取它。TLS是使任何库线程安全的方法。您可以在TLS中的“静态”或“全局”数据上存储任何类型的数据,以便从另一个线程调用的同一函数不会损坏另一个线程中的“静态”或“全局”变量。这使得函数可以从不同的线程重新进入

它给了我什么,让我有一个全局变量是线程特定的?它可以给f.e.mishmashru提到的东西当我有许多函数从一个线程函数调用,它们都使用相同的数据,然后我使用TLS只是不通过堆栈传递数据,是吗?是的。例如,如果需要在代码的各个点了解登录用户,将这些信息存储在一个单例中的TLS中比将登录的用户传递到每个方法中更容易。您的理解是正确的,但在堆栈上进行解析要好得多。我同意TLS的实际用例数量较少,应首先探索其他替代方案。然而,我想说,对于线程执行的所有方法所共有的数据,使用TLS比修改数百个方法签名来传递这些数据更可取。动作不好,文章好!