本文介绍: C# 属于一种业务高层抽象的语言,它的很多底层被C++再次隔离了,想要理解本篇的TLS,还得需要往下一层一层的击穿,作为C#程序员太难了。
一:背景
1. 讲故事
有朋友在后台留言让我说一下C#的 ThreadStatic
线程本地存储是怎么玩的?这么说吧,C#的ThreadStatic是假的,因为C#完全是由CLR(C++)承载的,言外之意C#的线程本地存储,用的就是用C++运行时提供的 __declspec(thread)
或 __thread
来虚构的一套玩法,这一篇我们就来简单聊一聊。
二:C# 的线程本地存储
1. 虚构在哪里
在 C# 中使用ThreadStatic就可以将变量和线程进行绑定,参考代码如下:
在 CLR 中如何将 num 与 Thread 绑定呢?研究过 CLR 源码的朋友应该知道是用 ThreadLocalInfo
的,参考代码如下:
上面的 m_pThread 就是 C# Thread 在 CLR 层面的承载,怎么去验证呢?可以把代码跑起来,然后用 windbg 验证一下。
从卦中可以清楚的看到 m_pThread=0x000001e3506c5fa0
就是我们的主线程,最后的 num 就是放在与之关联的 ThreadLocalModule 中,这个比较简单,关注下汇编代码就好了,下面的 rax 就是 ThreadLocalModule。
CLR层面用了太多的高层虚构来玩了一套线程本地存储,其实最核心的还要理解再下一层的 __declspec(selectany)
,接下来聊聊这玩意是怎么玩的。
2. __declspec(selectany) 是怎么玩的
3. 静态TLS详解
三:总结
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。