C# 多執行緒

      在〈C# 多執行緒〉中尚無留言

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使用了。

🔒 更多內容,請登入會員繼續閱讀。

立即登入

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *