为什么要使用线程本地存储(TlsAlloc,TlsGetValue,ets)而不是局部变量

时间:2011-06-11 18:07:57

标签: multithreading storage local thread-local-storage

我的问题是为什么在线程函数中使用TLS机制而不仅仅是局部变量?能否请您提供一些很好的例子,或者TLS优于本地变量的优势是什么? 谢谢, Mateusz

5 个答案:

答案 0 :(得分:7)

如果你可以使用局部变量,那么你可以使用本地变量。作为最后的手段,您应该使用线程本地存储,它几乎具有与全局变量相同的所有缺点。虽然您正在寻找使用线程本地存储的理由,但实际上最佳做法是寻找避免它的方法!

答案 1 :(得分:4)

TLS对于特定于线程的用户会话上下文信息非常有用,但可能会在各种不相关的方法中使用。在这种情况下,TLS比在调用堆栈中上下传递信息更方便。

答案 2 :(得分:3)

以下是英特尔使用线程局部存储减少同步的良好链接: https://software.intel.com/en-us/articles/use-thread-local-storage-to-reduce-synchronization

答案 3 :(得分:2)

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

答案 4 :(得分:1)

线程局部存储可用于在每个线程的基础上模拟全局变量或静态变量。 “正常”局部变量不能。