C 多執行緒程式設計

2022-03-01 04:21:32 字數 2781 閱讀 4405

一、使用執行緒的理由

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

public static void testmethod(objectdata)}}

五、task類

使用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...