我的问题是为什么在线程函数中使用 TLS 机制而不仅仅是局部变量?您能否提供一些很好的示例,或者 TLS 相对于本地变量的优势是什么?谢谢你,马特乌斯
5 回答
如果你可以使用局部变量,那么就这样做,你总是可以使用局部变量。只有作为最后的手段,你才应该使用线程本地存储,它具有与全局变量几乎所有相同的缺点。尽管您正在寻找使用线程本地存储的理由,但实际上最佳实践是寻找避免它的方法!
这是英特尔关于使用线程本地存储减少同步的良好链接: https ://software.intel.com/en-us/articles/use-thread-local-storage-to-reduce-synchronization
TLS 对于线程特定的用户会话上下文信息等内容很有帮助,但可能用于各种不相关的方法。在这种情况下,TLS 比在调用堆栈上下传递信息更方便。
我知道使用 TLS 的一个很好的例子。当您实现 LIBC 或将 LIBC 变体之一移植到新平台时,您需要以某种方式使“errno”变量(在单线程平台上只是 extern int errno)对于每个线程都是唯一的。LIBC 函数只是将它存储在当前线程的 TLS 中,而对 errno 的调用只是从 TLS 中读取它。TLS 是使任何库线程安全的方法。您将任何类型的“静态”或“全局”数据存储在 TLS 中,因此从另一个线程调用的相同函数不会破坏另一个线程中的“静态”或“全局”变量。这使您的功能可以从不同的线程重新进入。
线程局部存储可用于在每个线程的基础上模拟全局或静态变量。“普通”局部变量不能。