C 中多執行緒的應用

2021-04-25 16:24:51 字數 3908 閱讀 3971

1.使用執行緒的情況

①.程式需要執行和兩個和多個任務

②.程式要等待某事件的發生:例如使用者輸入、檔案操作、網路操作和搜尋

③.後台程式

2.多執行緒的併發執行

如果有多個執行緒在執行,單cpu只有乙個,到底執行的哪個?

①.如果乙個執行緒連續占用cpu資源時間過長,其它的資源得不到執行,

則系統會強制的切換執行其它執行緒。(強制剝奪)

②.如果乙個執行緒沒事可做、cpu可執行其它執行緒。(主動放棄)

③.這是由作業系統的排程機制決定的,不同的作業系統排程機制不一樣。

一般無法精確的預料多執行緒的執行順序,在程式設計的時候應特別注意

3.建立並啟動執行緒

threadstart 執行緒啟動委託名=new threadstart(方法名);

thread 執行緒例項名=new thread(執行緒啟動委託名);

執行緒例項名.start();

4.終止執行緒

①.執行緒例項名.abort();用此方法的後果是不可恢復的終止執行緒。

②.執行緒例項名.interrupt();中斷後可恢復

5.休眠執行緒

①.執行緒例項名.sleep();

當執行緒sleep時,系統就立即退出執行佇列一段時間,當睡眠結束時,系統會產生乙個時鐘中斷,從而

使執行緒回到執行佇列中,從而恢復執行緒的執行。

6.掛起/恢復執行緒

①.執行緒例項名.suspend();掛起

與執行緒休眠不同,執行緒的掛起不會使執行緒立即停止執行,直到執行緒到達安全點之後它才可以將該

執行緒掛起,如果執行緒尚未啟動或已經停止,則它將不能掛起。

②.執行緒例項名.resume();恢復

將使乙個執行緒跳出掛起狀態並使該執行緒繼續執行。

乙個執行緒不能對另乙個執行緒呼叫sleep() ,但是乙個執行緒可以對另乙個執行緒呼叫suspend()。

還可以使用許多其它的方式來阻塞執行緒。例如,可以通過呼叫 thread.join 使乙個執行緒等待另乙個執行緒 (子執行緒)停止。使用monitor.wait使乙個執行緒等待訪問乙個同步物件。

7.序列化執行緒

①.執行緒例項名.jion();

例如在主線程中插入t.jion();

主線程執行到這條語句後,主線程(當前執行緒)立即進入阻塞狀態.直到t執行完後阻塞狀態才解除。

相當於把t的任務插入或串聯到主線程中,把兩條線索串聯成一條線索

8.執行緒的鎖定機制

執行緒的鎖定機制可以保證每次只有乙個執行緒可以訪問共享資源。

使用關鍵字lock

①.lock語句的語法

lock(物件引用)語句塊;

②.lock語句的功能

當物件被lock 鎖定時,訪問該執行緒的其它執行緒會進入等待的狀態。

③.物件鎖機制保證了物件訪問的完整性:只有乙個執行緒完成操作後,其它的執行緒才能進行操作。

④.一般情況下,當乙個執行緒寫某個變數,而同時可能有其它的執行緒讀或寫這個變數時,為了保持資料的一  

致性應該使用鎖定機制。

⑤.執行緒的安全性

執行緒安全性就是保護的類的成員和**的安全,從而使他們不會同時被幾個執行緒中斷,使用鎖定機制。

⑥.多執行緒公用乙個物件時,就不應該使用lock關鍵字了,這裡monitor,monitor提供了使執行緒共享資源的方 案。

monitor類可以鎖定乙個物件,乙個執行緒只有得到這把鎖才可以對該物件進行操作。

如:monitor.enter(obj);

monitor.exit(obj);

⑦.臨界區和鎖

當談論多執行緒應用程式的時候,首先應該想到的就是併發性問題。儘管這對於同時執行多個任務的程式是很有用的,但通常都是危險的。為了解決這個問題,在c#中提出了臨界區和鎖的概念。在程式設計中,臨界區是一塊在任何時候只能有乙個程序進入的區域。在c#中通過語句lock來宣告臨界區。lock宣告後面的**,不管是以行還是一塊**,在同一時間最多只能有乙個程序執行。

9.執行緒的優先順序具有不可靠性,就是說不能用優先順序來控制線程的執行順序。

10.後台執行緒

①.什麼是後台執行緒?比起應用程式的主圖形使用者介面(gui)執行緒來說,這些執行緒以較低的優先權在不同的過程中

執行著。對於不能立即執行結束, 又不想一直等待的任務,後台執行緒能很好的勝任。在c#中,把執行緒物件的      

isbackground屬性設為true,該執行緒即為後台執行緒。

後台執行緒跟前臺執行緒只有乙個區別,那就是後台執行緒不妨礙程式的終止。一旦乙個程序所有的前台執行緒都終止後,

clr將通過呼叫任意乙個存活中的後台程序的abort()方法來徹底終止程序。

注意:後台執行緒不能直接操作所在程序之外的資料引用。

②.怎樣與後台執行緒通訊?運用methodinvoker委派實體。

要使用methodinvoker委派,需要三個條件:

a.乙個建立委派的後台執行緒

thread thread=new thread(new threadstart(run));

thread.isbackground=true;//把thread設為後台執行緒

thread.start();

b.乙個用作後台執行緒與前台視覺化單元的介面的類級方法

public void run()

}catch(threadinterruptedexception e)

",e);

}catch(exception ex)

",ex);}}

c.乙個應用程式中可以更新的視覺化單元

public void updatelabel()

例1:使用多執行緒實現的打字練習(vs2005)

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.text;

using system.windows.forms;

using system.threading;

/** 編寫乙個基於windows窗體的應用程式,實現打字練習功能,要使用多執行緒,在主線程裡用

* timer控制項定時產生label控制項,每個label控制項顯示乙個隨機產生的字母,每產生乙個label

* 就新開乙個執行緒(輔助線程),這個執行緒用於控制label控制項的向下移動,主線程監視鍵盤

* 輸入,如果鍵盤輸入文字與這個label控制項的text相同,label就消失

*/namespace typewriteexcercise

private void frmtyped_load(object sender, eventargs e)

private void timer1_tick(object sender, eventargs e)

private void frmtyped_keypress(object sender, keypresseventargs e)

if(label.text[0]==e.keychar)

//label.text返回的是字串,label.text[0]返回第乙個字元。e.keychar返回的是字元。這樣都為字元才能判斷}}

}public class letter

}public void run()

_label.top += 1;//有標籤,上邊距就加1畫素;

thread.sleep(_speed * 5);//讓執行緒休眠(速度越快,休眠的時間越短。以毫秒為單位);

}if(thread.currentthread.isalive)//如果當前執行緒還是存活的

}catch (exception ex)

finally //釋放資源,不管是否發生異常,finally都要五條件的執行

_container.controls.remove(_label);//移除在窗體中產生的所有標籤}}

}}

多執行緒中lock的應用

看了很多關於c 中lock使用的說明,但是感覺都沒有說到點上。最近做了乙個應用,吃了一些苦頭才把lock搞明白,關於lock的定義我就不多說了,這次主要說說lock在多執行緒中的應用及實際應用過程中遇到的問題。多個執行緒訪問同乙個變數的時候就會用到lock,但是如何應用lock呢,lock物件需要o...

MFC中多執行緒的應用

做專案中涉及到多執行緒的操作,所以學習了一下mfc中多執行緒的用法!包括控制代碼的定義 初始化,執行緒函式的定義 初始化,鎖的使用。控制代碼的定義 cwinthread thread1 執行緒函式的定義 static uint thread1 func lpvoid lpparam 加static表...

多執行緒中lock的應用

看了很多關於c 中lock使用的說明,但是感覺都沒有說到點上。最近做了乙個應用,吃了一些苦頭才把lock搞明白,關於lock的定義我就不多說了,這次主要說說lock在多執行緒中的應用及實際應用過程中遇到的問題。多個執行緒訪問同乙個變數的時候就會用到lock,但是如何應用lock呢,lock物件需要o...