C 中級 多執行緒

2021-10-11 07:26:19 字數 3222 閱讀 2113

執行緒

講多執行緒之前,我們先講執行緒。

c#中的執行緒類叫thread,主要用來建立或控制線程。

先上個例子

static void main(string args)public static void threadtest()
new了乙個執行緒,傳入了乙個委託引數threadtest()。

然後給執行緒設定了乙個名稱

最後呼叫執行緒的start()方法,啟動執行緒。

委託方法中輸出了執行緒的名稱。

多執行緒

多執行緒,其核心價值是為了在同一時間段內完成多個任務。

結合現實場景來看,就是火車站售票廳的售票視窗了。如果只有乙個售票視窗,以我國人口基數來看,顯然是不現實的。所以,多個售票視窗就滿足多執行緒的概念,同乙個時間段,處理多個任務。

多執行緒也是有缺點的,每開闢乙個新的執行緒,勢必要占用一定的記憶體空間,開闢的越多,占用的記憶體也就越多。

執行緒的概念基本上大家應該了解了,接下來通過實際例子來深入了解執行緒在實際操作過程中可能遇到的問題。

例子我們用之前說到的火車站售票視窗,來講多執行緒的第乙個問題。併發訪問共享資料問題。假如,乙個車次有100張可售票。有10個視窗同時售賣這100張票,那麼此時的"10個視窗同時售賣"就是併發訪問,"100張票"就是共享資料。在現實中,顯然不能因為有多個人在賣,就出現第101張票,甚至更多票的情況。

我們先模擬乙個多執行緒售票的**。

ps*本例子分為多個**片段,每個片段都在講乙個知識點!!!!所有的例子我都在模擬新手了解多執行緒的思路去編寫。懂的人可以跳過,不懂的朋友請耐心看每乙個例子的**,以及分析。

例子1

//總票數。public static int ticketscount = 100;static void main(string args)console.readkey();}//售票方法public static void sellticket()
根據題幹,我在例子1中,定義了乙個變數ticketscount來儲存總票數。然後我使用for迴圈建立了10個執行緒,用來模擬10個不同的售票視窗,且每個執行緒都呼叫sellticket()售票方法,方法中每次呼叫會讓總票數減少1,用來模擬售票效果。然後我們執行檢視結果:

不對呀,10個視窗,只賣了10張票,然後就沒有賣了?回過頭看**,找到問題了。因為執行緒需要明確的指示去執行動作,如果你沒有給與執行緒明確的指示動作,他在完成以後會自動停止。而我們的sellticket()售票方法中,只是進行了一次售賣,就沒有下一步指示了,於是所有的售票視窗在售賣了一次票以後,就自動停止了。根據上述結論,我們來改造例子2

例子2

//售票方法public static void sellticket()}
例子2中,我使用while迴圈,改造了sellticket()售票方法。之前沒講過while迴圈,這裡講一下。while關鍵字後面跟著的就是條件語句,用來判斷迴圈內的語句在什麼情況下執行,我這裡的條件是,如果總票數大於0,則繼續售賣。總票數是100,每次售賣總票數都會減1,一直到沒有票了,就不再執行。然後我們看下執行效果:

這次看起來,好像是對了,有多個視窗在同時售票,且每次售賣總票數都減少了。直到總票數為0的時候,確實停止售票了。但是,現在資料量小,只有100次操作,我們還可以逐條去對比他的正確性,那麼,如果有成千上萬條資料的時候,我們又如何去對比資料的正確性呢?最簡單的第一思維,就是建立乙個計數器了,用乙個變數來儲存售票的次數,最終停止售票時,我們輸出一下計數器的值,看看是否是正確的。

例子3

public static int sellcount = 0;//售票方法public static void sellticket()console.writeline("最終售票:" + sellcount);}
我定義了乙個sellcount變數,用來記錄售票次數,sellticket()方法在被呼叫執行售票時,每次對sellcount變數進行+1操作。然後我們看看執行結果:

對了,沒有問題,最終售票確實是100張。而之所以執行了10次最終售票列印是因為每個視窗在其售票完成後,都會輸出一次。

但是!!!多執行緒僅此而已嗎?出現這種結果其實很有可能是電腦的運算速度快,所以看起來沒有延遲計算,最終其售票正確了​​​​​​​,而在現實場景中,某個售票視窗,是很容易被其他的因素擾亂售票的程序的(比如顧客問價、網路延遲)。所以我們為了模擬被其他因素影響售票的效果,我們使用執行緒休眠的動作,讓每個視窗在每次售票時都停頓100毫秒看看。

例子3如果你多次重複執行,你也有可能看到錯誤,前提是你電腦足夠慢

例子4

//售票方法public static void sellticket()console.writeline("最終售票:" + sellcount);}
注意例子4,我在售票和計數之前,使用

thread.currentthread.join(100);

讓當前執行緒阻塞了100毫秒,模擬在售票過程中遇到的其他因素,再來看看執行結果:

很顯然,在例子4中。出現了額外售票的情況。這如果發生在現實中,那就亂套了。所以,多個執行緒在訪問共享的資料時,會因為一些額外因素出現一些資料bug,所以在程式中,針對多執行緒的執行,我們需要有其他的辦法來控制線程,從而避免這種錯誤的產生。

c 執行緒池 多執行緒

1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...

C 多執行緒 建立執行緒

c 中線程的建立一般是通過std thread類實現的,具體的實現方式有以下幾種 void operator int a 過載括號運算子。如果無參則為void operator 這裡有兩種方法通過成員函式建立。而這兩種方法恰好也就是靜態成員函式和非靜態成員函式的區別。靜態成員函式與物件無關,只屬於類...

C 多執行緒 執行緒安全

當使用多執行緒時,可能存在同時訪問乙個變數,導致變數被汙染問題,所以需要通過程式設計克服這個問題。採用多個執行緒,分別記數,然後檢視最終計算結果,如下 include include include 計數全域性變數 long cnt 0 計數程式 void counter int main int ...