一、使用執行緒的理由
1、可以使用執行緒將**同其他**隔離,提高應用程式的可靠性。
2、可以使用執行緒來簡化編碼。
3、可以使用執行緒來實現併發執行。
二、基本知識
1、程序與執行緒:程序作為作業系統執行程式的基本單位,擁有應用程式的資源,程序包含執行緒,程序的資源被執行緒共享,執行緒不擁有資源。
2、前台執行緒和後台執行緒:通過thread類新建執行緒預設為前台執行緒。當所有前台執行緒關閉時,所有的後台執行緒也會被直接終止,不會丟擲異常。
3、掛起(suspend)和喚醒(resume):由於執行緒的執行順序和程式的執**況不可預知,所以使用掛起和喚醒容易發生死鎖的情況,在實際應用中應該盡量少用。
4、阻塞執行緒:join,阻塞呼叫執行緒,直到該執行緒終止。
5、終止執行緒:abort:丟擲 threadabortexception 異常讓執行緒終止,終止後的執行緒不可喚醒。interrupt:丟擲 threadinterruptexception 異常讓執行緒終止,通過捕獲異常可以繼續執行。
6、執行緒優先順序:abovenormal belownormal highest lowest normal,預設為normal。
三、執行緒的使用
執行緒函式通過委託傳遞,可以不帶引數,也可以帶引數(只能有乙個引數),可以用乙個類或結構體封裝引數。
namespacetest四、執行緒池public static voidtestmethod()
public static void testmethod(objectdata)
", datastr);}}
}
由於執行緒的建立和銷毀需要耗費一定的開銷,過多的使用執行緒會造成記憶體資源的浪費,出於對效能的考慮,於是引入了執行緒池的概念。執行緒池維護乙個請求隊 列,執行緒池的**從佇列提取任務,然後委派給執行緒池的乙個執行緒執行,執行緒執行完不會被立即銷毀,這樣既可以在後台執行任務,又可以減少執行緒建立和銷毀所帶 來的開銷。
執行緒池執行緒預設為後台執行緒(isbackground)。
namespacetest五、task類public static void testmethod(objectdata)}}
使用threadpool的queueuserworkitem()方法發起一次非同步的執行緒執行很簡單,但是該方法最大的問題是沒有乙個內建的機制 讓你知道操作什麼時候完成,有沒有乙個內建的機制在操作完成後獲得乙個返回值。為此,可以使用system.threading.tasks中的task 類。
構造乙個task物件,並為泛型tresult引數傳遞乙個操作的返回型別。
namespacetest乙個任務完成時,自動啟動乙個新任務。private staticint32 sum(int32 n)
//結果太大,丟擲異常
returnsum;}}
}
乙個任務完成後,它可以啟動另乙個任務,下面重寫了前面的**,不阻塞任何執行緒。
namespacetest六、委託非同步執行",t.result));
console.readkey();
}private staticint32 sum(int32 n)
//結果溢位,丟擲異常
returnsum;}}
}
委託的非同步呼叫:begininvoke() 和 endinvoke()
namespacetest七、執行緒同步//執行緒函式
public static string testmethod(objectdata)
//非同步**函式
public static voidtestcallback(iasyncresult data)}}
1)原子操作(interlocked):所有方法都是執行一次原子讀取或一次寫入操作。
2)lock()語句:避免鎖定public型別,否則例項將超出**控制的範圍,定義private物件來鎖定。
3)monitor實現執行緒同步
通過monitor.enter() 和 monitor.exit()實現排它鎖的獲取和釋放,獲取之後獨佔資源,不允許其他執行緒訪問。
還有乙個tryenter方法,請求不到資源時不會阻塞等待,可以設定超時時間,獲取不到直接返回false。
4)readerwriterlock
當對資源操作讀多寫少的時候,為了提高資源的利用率,讓讀操作鎖為共享鎖,多個執行緒可以併發讀取資源,而寫操作為獨佔鎖,只允許乙個執行緒操作。
5)事件(event)類實現同步
事件類有兩種狀態,終止狀態和非終止狀態,終止狀態時呼叫waitone可以請求成功,通過set將時間狀態設定為終止狀態。
1)autoresetevent(自動重置事件)
2)manualresetevent(手動重置事件)
6)訊號量(semaphore)
訊號量是由核心物件維護的int變數,為0時,執行緒阻塞,大於0時解除阻塞,當乙個訊號量上的等待執行緒解除阻塞後,訊號量計數+1。
執行緒通過waitone將訊號量減1,通過release將訊號量加1,使用很簡單。
7)互斥體(mutex)
獨佔資源,用法與semaphore相似。
8)跨程序間的同步
通過設定同步物件的名稱就可以實現系統級的同步,不同應用程式通過同步物件的名稱識別不同同步物件。
C 多執行緒程式設計
一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...
C 多執行緒程式設計
乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...
C 多執行緒程式設計
建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...