我有一個標有ThreadStaticAttribute
的字段。它在主線程中被初始化,但是我的代碼使用了很多async/await
結構和Parallel
庫,這就是爲什麼我不知道要執行多少個線程的原因。我想確保每個線程都將此字段初始化。我該怎麼做?如何初始化線程池中每個新線程標記爲ThreadStaticAttribute的靜態字段?
3
A
回答
4
隨着ThreadStaticAttribute
你不能以你想要的方式執行初始化。 Actully,文檔指出你不應該執行在所有的初始化:
的字段標有 ThreadStaticAttribute不要指定初始值,因爲這樣的初始化類的構造函數執行時只發生一次, ,因此隻影響一個 線程
但是,您可以使用替代:ThreadLocal<T>
:
private ThreadLocal<string> _myVar = new ThreadLocal<string>(() => "some string");
var s = _myVar.Value; // separate for each thread
_myVar.Value = "changed";
請注意,ThreadLocal<T>
執行IDisposable
,因此必須在您完成後處置。
您也可以實現ThreadStatic
字段的單獨訪問器,該字段將首先檢查字段是否已初始化,如果未初始化,則初始化該字段,然後返回值(類似於單例模式)。由於ThreadStatic
字段,因此不需要任何鎖就可以線程安全。
另請注意,使用ThreadStatic
或ThreadLocal
與線程池線程(就像您一樣)可能會導致令人驚訝的行爲,因爲當線程返回到池時本地線程存儲不會被清除。所以你可能會「開始」一個新的線程(當真正的線程退出池中時),並且該線程可能已經在上一次迭代中留下的`ThreadLocal`字段中具有值ThreadStatic
。
相關問題
- 1. 初始化靜態塊中的線程?
- 2. 全局靜態初始化線程
- 3. 什麼線程正在初始化靜態字段?
- 4. 靜態字段初始化
- 5. C++,是由多個線程執行的靜態初始化?
- 6. 如何初始化Kotlin中的線程?
- 7. C++中的靜態初始化和線程安全
- 8. 線程池中的線程狀態
- 9. 如何使用線程池來處理新線程中的每個連接
- 10. 多線程 - 新線程vs線程池
- 11. 初始化主線程
- 12. 如何初始化多線程上下文中的靜態變量?
- 13. Rayon中的每個線程的初始化
- 14. 內部非線程安全字符串變體和靜態初始化程序
- 15. 等待初始化池中的所有線程
- 16. 靜態初始化器和線程同步(.NET)
- 17. 線程安全Singletion靜態方法初始化
- 18. C++靜態變量初始化和線程
- 19. asm中的靜態初始化程序
- 20. 靜態初始化程序中的Task.Run
- 21. 無法初始化線程構造函數中的PrintWriter字段
- 22. 如何創建多個線程池(即多個執行程序,每個線程池都有一個線程)
- 23. 線程化類成員函數;線程初始化通過初始化列表
- 24. 線程池中的線程
- 25. NotesContext未初始化爲線程
- 26. 如何使用ASM爲初始化程序添加靜態最終字段?
- 27. 使用jboss5線程池開始線程
- 28. 靜態字段無法初始化
- 29. 通用靜態字段初始化
- 30. 靜態字段/屬性初始化
您可以在首次訪問時初始化它(即 - 您想讀取值,請參閱字段尚未初始化 - 初始化它)。 – Evk
@Evk在訪問之前有什麼方法可以初始化它嗎? –
我不這麼認爲。實際上初始化它是不鼓勵的,因爲docs聲明:「不要爲用ThreadStaticAttribute標記的字段指定初始值,因爲這種初始化只發生一次,當類構造函數執行時,因此隻影響一個線程。」我想,你可以使用'ThreadLocal'來做你想做的事。 –
Evk