天天看點

關于C#線程池與核心級線程池的了解

最近在與大部分C#人員聊天的過程中發現一個問題,許多人都對線程有一定程度的了解與不了解,之是以這麼說,是因為有很多人都分不清楚線程池到底是什麼東西,想要了解線程池什麼,那麼就要了解線程的機制與線程的工作模式,既然這樣,我想還是寫一些關于這方面我的了解。

大家都知道,線程是在程序之内的工作單元,同一個程序中的兩個線程工作的時候使用的是同一個程式資源,那麼就問了,現在一個程序出現了兩個線程A和B,如果A針對一個公共變量i做++處理,B線程針對i做減減處理的時候,那麼就要在i上加鎖,但是你們難道真的任務這個鎖就一定能鎖住麼?

我們在了解這個情況時,我們必須要想一想核心的排程模式,在一個指令周期中,所處理的指令隻能是一個,但是這個指令周期不一定耗費了多少時間周期,那麼核心在切換每個程序工作時,勢必會有一定的時間周期延遲,那麼這些時間周期延遲,就會導緻線程排程的延遲,若果線上程中利用lock進行同步操作過程中,勢必會出現這樣一件事情,當A獲得鎖的使用權的時候,核心正好切換到B的線程排程,那麼,B此時在使用i變量的時候正好在處于加鎖狀态,那麼B此時的處理就會被認為無效的,那麼核心就會在切換回A的狀态,但是此時A正好在使用這個鎖,就會導緻i+2的問題,但是這并不是我們業務所需要的,是以,鎖并時不是可靠的,那麼問題來了,有的人會問,那C#就處理不了多線程問題了?回答不是的,因為,C#使用的是使用者級線程,并非系統級或者核心級的,如果想使用高性能線程的情況下,查查MSDN會告訴你,請使用C/C++,這就是答案,除非你使用unsafe代碼去管理線程,那麼,我們還用C#有啥用了?利用了指針等還不如回到C++來操作更好了。

另外,我們要知道,在核心上使用線程池或者線程的時候,我們要明确一件事情,什麼是workercontext,什麼是threadcontext,核心是如何将threadcontext與workercontext整合在一起并且形成一個worker來進行工作的,又如何進行工作排程的。

如果不了解這些,你們建立的線程就是想當然,而計算機并不是想當然來進行運作的,是以,在談論C#線程的時候,我們要知道,我們C#的線程到底是工作在哪個層次的,這點十分重要。