聰明的小明同學,昨天聽了外老師的講解之後,意猶未盡的回家,正琢磨著,怎麼樣使用多執行緒技術,加速大量小任務的處理速度!
就在今天早晨,小明在早餐店看到了這樣一幕:
這是一家非常火爆的早餐店,老闆配備了兩台收銀機,在早高峰的時候,兩台收銀機全速執行,以提高顧客點單的速度。
小明點了乙份熱乾麵,只見收銀員將小明的訂單遞給了第一位小哥,小哥接到訂單之後,非常熟練地將適量麵條,放入乙個錐形的容器中,然後放入身旁的熱鍋中去煮。
這時候,前面的另乙個阿姨,正好取走了放在鍋裡的另乙份麵條,快速的取乙個碗,倒入麵條,加入芝麻醬,還有其他調料,半分鐘左右,這乙份熱麵就交到了小明前面的一位小姐姐手中。
然後阿姨就開始做小明的那一碗麵條了。。。
小明似乎明白了什麼,他興致勃勃的來到教室,向我講述他買早餐時的所見,說道:
老師,流水線啊!我們可以讓乙個執行緒,處理多個小任務,不就可以避免開啟過多執行緒的問題了嗎!這樣在提高任務處理速度的同時,也避免了開啟過多執行緒的昂貴成本。如果我們有多種任務,還可以開啟多個執行緒還處理不同的任務。
這時外老師的臉上,洋溢著滿意的笑容,對小明說到:小明,你前途無量啊!加油,好好學。
早餐店的老闆,不可能為每乙個顧客,僱乙個員工為其提供服務。而是僱幾個員工,分別負責不同的工序。在比較耗時的工序,通常會增加員工的數量,以保證流水線中的每乙個員工都不閒著。
流水線同時還有一大好處,就是每乙個員工,只需掌握自己這乙個工序的技能,每天重複同樣的工作,動作非常的嫻熟。員工培養的成本也非常低。還不用擔心員工自己出去單幹。。。
這個思路,在軟體行業,也同樣流行。
我們可以自己將任務分類,分組,將每一組任務,交給乙個執行緒來處理。我們只需要簡單的**,就可以實現這個邏輯。
當然,軟體行業還有乙個特點,就是通常不需要我們自己造輪子,而是直接使用別人造好的輪子。沒錯,微軟已經為我們提供了現成的執行緒池實現threadpool。我們直接使用即可。
class data public int id public void dosomething() }static void multithread(ilist datas)}
然後我們使用threadpool再寫乙個測試函式:
static void multithreadpool(ilist datas)}
我們在兩個測試函式中,都只將任務新增到多執行緒中去執行,先不考慮其執行結果,單純比較執行緒的新增效率:
public static void main()"); sw.restart(); multithreadpool(dts); sw.stop(); var tc2 = sw.elapsedticks; console.writeline($"thread pool time costs: "); console.writeline($"rate: "); // 加入對比 console.readkey();}
編譯執行結果如下:
可以看到,threadpool的效率,提公升了5倍左右。這可能不算特別突出的效率提公升。但是當我們把任務的數量提公升到1萬個,情況會有什麼不同嗎:
static ilist makedata() return datas;}
執行結果如下:
可以看到,速度提公升已經到了200多倍了。可見任務數量越多,threadpool的優勢越明顯。
最後我們將任務數量調整為20個,並在**中,加入檢測線程id的**,然後觀察一下執行緒池中的任務的執**況:
static ilist makedata() return datas;}class data public int id public void dosomething() " + $" data id:"); }}public static void main()
執行結果如下:
可以看出,20個任務,分布在8個執行緒中執行,其中10號執行緒,執行的任務數量最多。
由此可以看出來,threadpool確實可以重複使用執行緒。其中的執行緒,和流水線中的工人一樣,可以重複做乙個工序中的工作。
當然,threadpool中的執行緒,比工人厲害的地方,就是執行緒可以完成各種各樣的工序,哪個工序需要,就去哪個環節幹活。
所以使用threadpool,比現實中的流水線,可以更加靈活,因為每乙個工人都是全能選手。
我們無法控制threadpool中的執行緒的開始、掛起、和中止。
終於講完了!我看了一眼小明,他又在看著我點頭!
下面是給同學們準備的乾貨:
《c#中多執行緒的那點事兒-thread入門》
《c#中多執行緒的那點事-多執行緒的代價》
《c#中多執行緒的那點事-鎖》
《c#中多執行緒的那點事-死鎖》
《c#中多執行緒的那點事-task再次起航》
《c#中多執行緒的那點事-parallel》
《c#中多執行緒的那點事-linq & plinq》
《c#中多執行緒的那點事-async & await》
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。include int value 0 void test int main 1 資料斷點 所謂資料斷點,就是全域性變數或者函式中的數...
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。include int value 0 void test int main 1 資料斷點 所謂資料斷點,就是全域性變數或者函式中的數...
多執行緒的那點兒事(之多執行緒除錯)
軟體除錯是我們軟體開發過程中的重要一課。在前面,我們也討論過程式除錯,比如說這裡。今天,我們還可以就軟體除錯多講一些內容。比如說條件斷點,資料斷點,多執行緒斷點等等。cpp view plain copy include intvalue 0 void test intmain 1 資料斷點 所謂資...