C#執行緒本地儲存:LocalDataStoreSlot和ThreadLocal
http://www.csharpwin.com/csharpspace/13101r4743.shtml
1. 使用ThreadStatic特性
ThreadStatic特性是最簡單的TLS使用,且只支援靜態欄位,只需要在欄位上標記這個特性就可以了:
可以看到,str靜態欄位在兩個執行緒中都是獨立儲存的,互相不會被修改。
2. 使用命名的LocalDataStoreSlot型別
顯然ThreadStatic特性只支援靜態欄位太受限制了。.NET執行緒型別中的LocalDataStoreSlot提供更好的TLS支援。我們先來看看命名的LocalDataStoreSlot型別,可以通過Thread.AllocateNamedDataSlot來分配一個命名的空間,通過Thread.FreeNamedDataSlot來銷燬一個命名的空間。空間資料的獲取和設定則通過Thread型別的GetData方法和SetData方法。
來看程式碼:
3. 使用未命名的LocalDataStoreSlot型別
執行緒同樣支援未命名的LocalDataStoreSlot,未命名的LocalDataStoreSlot不需要手動清除,分配則需要Thread.AllocateDataSlot方法。注意由於未命名的LocalDataStoreSlot沒有名稱,因此無法使用Thread.GetNamedDataSlot方法,只能在多個執行緒中引用同一個LocalDataStoreSlot才可以對TLS空間進行操作,將上面的命名的LocalDataStoreSlot程式碼改成未命名的LocalDataStoreSlot執行:
4. 使用.NET 4.0的ThreadLocal<T>型別
.NET 4.0線上程方面加入了很多東西,其中就包括ThreadLocal<T>型別,他的出現更大的簡化了TLS的操作。ThreadLocal<T>型別和Lazy<T>驚人相似,建構函式引數是Func<T>用來建立物件(當然也可以理解成物件的預設值),然後用Value屬性來得到或者設定這個物件。
ThreadLocal的操作或多或少有點像上面的未命名的LocalDataStoreSlot,但ThreadLocal感覺更簡潔更好理解。
程式碼:
5. 強調一下不同方法和TLS的預設值
上面程式碼都是一個一個執行緒設定值,另一個執行緒直接修改值然後輸出,不會覺察到TLS中預設值的狀況,下面專門強調一下不同方法的預設值狀況。
ThreadStatic不提供預設值:
顯然本地執行緒TLS資料時123,而靜態變數的預設值不會在另一個執行緒中初始化的。
LocalDataStoreSlot很容易可以看出來,不可能有預設值,因為初始化只能構造一個空間,而不能賦予它值,Thread.SetData顯然只會在TLS中設定資料,還是用程式碼演示一下:
第二行是True,那麼另一個執行緒中的資料是null。
最後重點:.NET 4.0後的ThreadLocal會提供預設值的,還記得我上面說的那句話“ThreadLocal的操作或多或少有點像上面的未命名的LocalDataStoreSlot”?有人可能會問那為什麼要創造出ThreadLocal?還有一個很大的區別ThreadLocal可以提供TLS中資料的預設值。(另外還有ThreadLocal是泛型類,而LocalDataStoreSlot不是)。
程式碼:
相關文章
- Java執行緒(篇外篇):執行緒本地變數ThreadLocalJava執行緒變數thread
- 使用執行緒本地變數儲存會員資訊執行緒變數
- 執行緒本地ThreadLocal的介紹與使用!執行緒thread
- 【多執行緒】ThreadLocal原理執行緒thread
- java多執行緒——ThreadLocalJava執行緒thread
- InnoDB儲存引擎——後臺執行緒儲存引擎執行緒
- 執行緒區域性儲存(TLS)執行緒TLS
- c#執行緒-執行緒同步C#執行緒
- java 併發,為執行緒建立本地變數 ThreadLocal的使用Java執行緒變數thread
- 深入理解java:執行緒本地變數 java.lang.ThreadLocal類Java執行緒變數thread
- 【物件儲存】Minio本地執行和 golang客戶端基本操作物件Golang客戶端
- C#多執行緒之旅(2):建立和開始執行緒C#執行緒
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- 執行緒安全處理之Threadlocal執行緒thread
- 執行緒的私有領地 ThreadLocal執行緒thread
- C#執行緒C#執行緒
- C#多執行緒(6):執行緒通知C#執行緒
- [深入學習C#]C#實現多執行緒的方法:執行緒(Thread類)和執行緒池(ThreadPool)C#執行緒thread
- C#多執行緒之旅(3):執行緒池C#執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- C# 多執行緒C#執行緒
- C# 執行緒(一)C#執行緒
- 本地儲存
- 執行緒轉儲:命名你的執行緒和檢視系統(轉)執行緒
- 執行緒和執行緒池執行緒
- C#多執行緒開發-執行緒同步 02C#執行緒
- C#多執行緒開發-執行緒池03C#執行緒
- Java多執行緒與併發之ThreadLocalJava執行緒thread
- Java多執行緒9:ThreadLocal原始碼剖析Java執行緒thread原始碼
- 解密TaurusDB儲存端高併發之執行緒池解密執行緒
- Linux中的執行緒區域性儲存(2)Linux執行緒
- C#中的執行緒二(BeginInvoke和Invoke)C#執行緒
- C#多執行緒開發-執行緒基礎 01C#執行緒
- C# 多執行緒猜想C#執行緒
- Java併發程式設計:執行緒封閉和ThreadLocal詳解Java程式設計執行緒thread
- JavaScript 本地儲存JavaScript
- web本地儲存Web
- angular 本地儲存Angular