C 多執行緒程式設計 整理

2022-02-04 01:08:39 字數 2159 閱讀 9322

donet基礎類庫的system.threading命名空間提供了大量的類和介面支援多執行緒。這個命名空間有很多的類,下面是thread的資料。

system.threading.thread類是用來建立並控制線程,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的方法做一下介紹:

thread.start():啟動執行緒的執行;

thread.suspend():掛起執行緒,或者如果執行緒已掛起,則不起作用;

thread.resume():繼續已掛起的執行緒;

thread.interrupt():中止處於 wait或者sleep或者join 執行緒狀態的執行緒;

thread.join():阻塞呼叫執行緒,直到某個執行緒終止時為止

thread.sleep():將當前執行緒阻塞指定的毫秒數;

thread.abort():以開始終止此執行緒的過程。如果執行緒已經在終止,則不能通過thread.start()來啟動執行緒。

通過呼叫thread.sleep,thread.suspend或者thread.join可以暫停/阻塞執行緒。呼叫sleep()和suspend()方法意味著執行緒將不再得到cpu時間。這兩種暫停執行緒的方法是有區別的,sleep()使得執行緒立即停止執行,但是在呼叫suspend()方法之前,公共語言執行時必須到達乙個安全點。乙個執行緒不能對另外乙個執行緒呼叫sleep()方法,但是可以呼叫suspend()方法使得另外乙個執行緒暫停執行。對已經掛起的執行緒呼叫thread.resume()方法會使其繼續執行。不管使用多少次suspend()方法來阻塞乙個執行緒,只需一次呼叫resume()方法就可以使得執行緒繼續執行。已經終止的和還沒有開始執行的執行緒都不能使用掛起。thread.sleep(int x)使執行緒阻塞x毫秒。只有當該執行緒是被其他的執行緒通過呼叫thread.interrupt()或者thread.abort()方法,才能被喚醒。

如果對處於阻塞狀態的執行緒呼叫thread.interrupt()方法將使執行緒狀態改變,但是會丟擲threadinterupptedexception異常,你可以捕獲這個異常並且做出處理,也可以忽略這個異常而讓執行時終止執行緒。在一定的等待時間之內,thread.interrupt()和thread.abort()都可以立即喚醒乙個執行緒。

下面我們將說明如何從乙個執行緒中止另外乙個執行緒。在這種情況下,我們可以通過使用thread.abort()方法來永久銷毀乙個執行緒,而且將丟擲threadabortexception異常。使終結的執行緒可以捕獲到異常但是很難控制恢復,僅有的辦法是呼叫thread.resetabort()來取消剛才的呼叫,而且只有當這個異常是由於被呼叫執行緒引起的異常。因此,a執行緒可以正確的使用thread.abort()方法作用於b執行緒,但是b執行緒卻不能呼叫thread.resetabort()來取消thread.abort()操作。

thread.abort()方法使得系統悄悄的銷毀了執行緒而且不通知使用者。一旦實施thread.abort()操作,該執行緒不能被重新啟動。呼叫了這個方法並不是意味著執行緒立即銷毀,因此為了確定執行緒是否被銷毀,我們可以呼叫thread.join()來確定其銷毀,thread.join()是乙個阻塞呼叫,直到執行緒的確是終止了才返回。但是有可能乙個執行緒呼叫thread.interrupt()方法來中止另外乙個執行緒,而這個執行緒正在等待thread.join()呼叫的返回。

盡可能的不要用suspend()方法來掛起阻塞執行緒,因為這樣很容易造成死鎖。假設你掛起了乙個執行緒,而這個執行緒的資源是其他執行緒所需要的,會發生什麼後果。因此,我們盡可能的給重要性不同的執行緒以不同的優先順序,用thread.priority()方法來代替使用thread.suspend()方法。

thread類有很多的屬性,這些重要的屬性是我們多執行緒程式設計必須得掌握的。

thread.isalive屬性:獲取乙個值,該值指示當前執行緒的執行狀態。如果此執行緒已啟動並且尚未正常終止或中止,則為 true;否則為 false。

thread.name 屬性:獲取或設定執行緒的名稱。

thread.priority 屬性:獲取或設定乙個值,該值指示執行緒的排程優先順序。

thread.threadstate 屬性:獲取乙個值,該值包含當前執行緒的狀態。

在下面的例子中,我們將看看怎麼設定這些屬性,在隨後的例子中我們將詳細的討論這些屬性。

建立乙個執行緒,首先得例項化乙個thread類,在類得建構函式中呼叫threadstart委派。這個委派包含了執行緒從**開始執行。當執行緒啟動後,start()方法啟動乙個新的執行緒。下面是例子程式。

C 多執行緒程式設計 整理

donet基礎類庫的system.threading命名空間提供了大量的類和介面支援多執行緒。這個命名空間有很多的類,下面是thread的資料。system.threading.thread類是用來建立並控制線程,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的...

pthread多執行緒程式設計整理(二)

補充 在傳統的unix模型中,當乙個程序需要由另乙個實體執行某件事時,該程序派生 fork 乙個子程序,讓子程序去進行處理。unix下的大多數網路伺服器程式都是這麼編寫的,即父程序接受連線,派生子程序,子程序處理與客戶的互動。雖然這種模型很多年來使用得很好,但是fork時有一些問題 1.fork是昂...

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...