聊一聊 C# 的线程本地存储TLS到底是什么
💡
原文中文,约5800字,阅读约需14分钟。
📝
内容提要
C#的ThreadStatic是通过C++运行时提供的__declspec(thread)或__thread来实现的。在CLR中,使用ThreadLocalInfo将变量与线程绑定。C#的线程本地存储使用静态TLS,在编译时就已经声明好,存放在TEB.ThreadLocalStoragePointer指向的指针数组中。通过windbg可以验证。C#是一种业务高层抽象的语言,理解TLS需要深入底层。
🎯
关键要点
- C#的ThreadStatic是通过C++运行时提供的__declspec(thread)或__thread实现的。
- C#的线程本地存储使用静态TLS,编译时声明,存放在TEB.ThreadLocalStoragePointer指向的指针数组中。
- 在C#中使用ThreadStatic可以将变量与线程绑定,使用ThreadLocalInfo进行管理。
- 静态TLS在PE文件中有一个.tls节点,每个线程在堆上复制一份。
- 动态TLS和静态TLS是Windows层面的两种TLS技术,C#使用静态TLS。
- 理解C#的TLS需要深入底层,C#是一种高层抽象的语言,底层实现复杂。
➡️