2

dotnet 在析构函数调用 ThreadLocal 也许会抛出对方已释放

 2 years ago
source link: https://lindexi.gitee.io/post/dotnet-%E5%9C%A8%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8-ThreadLocal-%E4%B9%9F%E8%AE%B8%E4%BC%9A%E6%8A%9B%E5%87%BA%E5%AF%B9%E6%96%B9%E5%B7%B2%E9%87%8A%E6%94%BE.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

dotnet 在析构函数调用 ThreadLocal 也许会抛出对方已释放

我在不自量力做一个数组池,就是为了减少使用 System.Buffers.dll 程序集,然而在数组池里面,所用的 ThreadLocal 类型,在我对象析构函数进行归还数组时,抛出了无法访问已释放对象

先来看第一个张图,亮点在于线程是 GC 终结器线程

lindexi%2F202111292027212000.jpg

调用堆栈是 ~ByteListMessageStream 函数,也就是 ByteListMessageStream 的 析构函数。代码如下

        ~ByteListMessageStream()
        {
            _sharedArrayPool.Return(Buffer);
        }

lindexi%2F202111292029373046.jpg

在进行数组归还的时候,因为 ThreadLocal 已被释放,所在的线程也不存在。此时的访问将失败,如下图

lindexi%2F20211129202922896.jpg

请大家不要重复踩入此坑


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-%E5%9C%A8%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8-ThreadLocal-%E4%B9%9F%E8%AE%B8%E4%BC%9A%E6%8A%9B%E5%87%BA%E5%AF%B9%E6%96%B9%E5%B7%B2%E9%87%8A%E6%94%BE.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号
lindexi%2F201985113622445

欢迎进入 Eleven 老师组建的 .NET 社区
lindexi%2F20209121930471745.jpg

以上广告全是友情推广,无盈利


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK