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()方法啟動乙個新的執行緒。下面是例子程式。
using system;
using system.threading ;
namespace learnthreads
public static void main()}
多執行緒在.net裡如何工作?
在本質上和結構來說,.net是乙個多執行緒的環境。有兩種主要的多執行緒方法是.net所提倡的:使用threadstart來開始你自己的程序,直接的(使用threadpool.queueuserworkitem)或者間接的(比如stream.beginread,或者呼叫begininvoke)使用threadpool類。一般來說,你可以"手動"為長時間執行的任務建立乙個新的執行緒,另外對於短時間執行的任務尤其是經常需要開始的那些,程序池是乙個非常好的選擇。程序池可以同時執行多個任務,還可以使用框架類。對於資源緊缺需要進行同步的情況來說,它可以限制某一時刻只允許乙個執行緒訪問資源。這種情況可以視為給執行緒實現了鎖機制。執行緒的基類是system.threading。所有執行緒通過cli來進行管理。
·建立執行緒:
建立乙個新的thread物件的例項。thread的建構函式接受乙個引數:
thread dummythread = new thread( new threadstart(dummyfunction) );
·執行執行緒:
使用threading命名空間裡的start方法來執行執行緒:
dummythread.start ();
·組合執行緒:
經常會出現需要組合多個執行緒的情況,就是當某個執行緒需要其他執行緒的結束來完成自己的任務。假設dummythread必須等待dummyprioritythread來完成自己的任務,我們只需要這樣做:
dummyprioritythread.join() ;
·暫停執行緒:
使得執行緒暫停給定的秒
dummyprioritythread.sleep();
·中止執行緒:
如果需要中止執行緒可以使用如下的**:
dummyprioritythread.abort();
·同步
using system;using system.threading;namespace synchronizationthread***ample
public void threadfunction ( ) ", dummythread.name);
thread dummyprioritythread = new thread( new threadstart(somefunction) );
dummyprioritythread.isbackground=true;
dummyprioritythread.name = "second thread";
dummyprioritythread.start( );
console.writeline("started thread ", dummyprioritythread.name);
dummythread.join( );
dummyprioritythread.join( );
} public void somefunction( ) . somefunction: ",thread.currentthread.name, counter);}}
catch (threadinterruptedexception ex) ", thread.currentthread.name);
} finally exiting. ",thread.currentthread.name); }}
}} ·使用interlock
c#提供了乙個特殊的類叫做interlocked,就是提供了鎖機制的實現,我們可以加入如下的**實現鎖機制:
interlocked.somefunction (ref counter);
·使用鎖
這是為了鎖定**關鍵區域以進行同步,鎖定**如下:
lock (this)
·使用monitor
當有需要進行執行緒管理的時候我們可以使用:
monitor.enter(this);
其他也有一些方法進行管理,這裡就不一一提及了。
C 多執行緒程式設計 整理
donet基礎類庫的system.threading命名空間提供了大量的類和介面支援多執行緒。這個命名空間有很多的類,下面是thread的資料。system.threading.thread類是用來建立並控制線程,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的...
pthread多執行緒程式設計整理(二)
補充 在傳統的unix模型中,當乙個程序需要由另乙個實體執行某件事時,該程序派生 fork 乙個子程序,讓子程序去進行處理。unix下的大多數網路伺服器程式都是這麼編寫的,即父程序接受連線,派生子程序,子程序處理與客戶的互動。雖然這種模型很多年來使用得很好,但是fork時有一些問題 1.fork是昂...
C 多執行緒程式設計
一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...