C# 多執行緒
行程
行程是一個執行中的程式, 現行分時系統中, 行程是基本的工作單元. 行程包括程式碼(本文區)、程式計數器數值、暫存器內容、行程堆疊、堆積、變數的資料區間。
行程有五種狀態 : 新產生、執行、等待、就緒、結束, 任何時候只能一個行程在執行狀態, 但有許多行程在等待和就緒的狀態。
每一個行程在作業系統中都對應一個行程控制表(PCB), PCB記載所代表的行程相關資訊。
分時系統可將CPU在不同行程間不斷切換, 以便讓使用者可以在自己的行程執行時與它互動。
一個新的行程最初置於就緒佇列中, 此行程被CPU執行時, 可觸發如下事件 :
發出I/O要求,然後置於一個I/O佇列中。
產生一個子行程,並等待其結束。
強行移離CPU(和中斷的結果一樣),然後放回就緒佇列中。
執行緒
執行緒是CPU使用時的一個基本單位, 由執行緒ID、程式計數器、一組暫存器及一個堆疊空間組成。
一個行程可擁有多個執行緒, 每個執行緒共用行程的資源(Ram, File, Signal)
行程的產生對系統來說是重擔,如果新行程和現存行程執行相同的工作,比較有效率的做法是讓一個行程產生新的執行緒來達到相同的目的。
多執行緒程式好處如下 :
應答 : 如一個執行緒載入影像時, 另一執行緒可以跟使用者互動
資源共享 : 執行緒共享行程內的Ram, 但也容易造成Dead Lock
經濟 : 執行緒消耗的資源比行程少
正規寫法
正規啟動執行緒, 必需使用 new Thread(ThreadStart物件).Start();
麻煩難懂的地方是, 什麼是ThreadStart物件.
我們可以把ThreadStart想成是一個物件, 把要作的任務塞在裏面. 所以更進一步的完整代碼如下
ThreadStart s=new ThreadStart(某個方法);
new Thread(s).Start();
現在怪異的地方又來了, 把某個方法塞到ThreadStart()這個建構子. 方法之內不是都只是塞資料型態嗎, 怎麼又塞方法呢?
原來他是使用Delegate(委派)的方式, ThreadStart是系統就寫好的, 原始碼如下
public delegate void ThreadStart();
我們只要產生ThreadStart物件, 將方法塞到裏面, 這個方法就會包在物件裏面, 然後這個方法就可以供Thread使用了。
