1. 程式人生 > 其它 >dotnet 在解構函式呼叫 ThreadLocal 也許會丟擲對方已釋放

dotnet 在解構函式呼叫 ThreadLocal 也許會丟擲對方已釋放

我在不自量力做一個數組池,就是為了減少使用 System.Buffers.dll 程式集,然而在陣列池裡面,所用的 ThreadLocal 型別,在我物件解構函式進行歸還陣列時,丟擲了無法訪問已釋放物件

我在不自量力做一個數組池,就是為了減少使用 System.Buffers.dll 程式集,然而在陣列池裡面,所用的 ThreadLocal 型別,在我物件解構函式進行歸還陣列時,丟擲了無法訪問已釋放物件

先來看第一個張圖,亮點在於執行緒是 GC 終結器執行緒

呼叫堆疊是 ~ByteListMessageStream 函式,也就是 ByteListMessageStream 的 解構函式。程式碼如下

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

在進行陣列歸還的時候,因為 ThreadLocal 已被釋放,所在的執行緒也不存在。此時的訪問將失敗,如下圖

請大家不要重複踩入此坑

部落格園部落格只做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/


本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯絡](mailto:[email protected])。