多執行緒小結

2021-06-27 21:56:51 字數 871 閱讀 8693

多執行緒中的4個概念:關鍵段、互斥量、事件和訊號量。其中關鍵段非核心變數,只能用於執行緒間同步問題,而其他的都是核心變數可用於程序間同步。關鍵段和互斥量一般用於互斥,因為他們有執行緒所有權的概念,擁有執行緒所有權的執行緒(通常是主線程)無視約束,可重複進入關鍵段。但是我想在子執行緒之間這個應該是可以用於同步的吧(有待實驗)。其中,互斥量可解決「遺留問題」(即執行緒在釋放互斥量前死亡造成的同步問題),這個是4個中獨有的。事件和訊號量可用於同步,訊號量可用於多數量資源的同步問題。

下面學習幾個經典的多執行緒問題:

讀者寫者問題:即寫者只能乙個人寫檔案,幾個讀者可同時讀檔案,讀寫是互斥的。這個寫者之間的互斥,讀寫之間的互斥用2個事件就解決了,即寫者寫完觸發事件1,讀者才能讀,而讀完事件觸發,寫者才能寫。幾個讀者不互斥的讀檔案,可用乙個變數m代表當前幾個讀者在讀。在讀者讀之前,若m=0,說明這是第乙個讀者,則設定讀完事件未觸發,然後++m。當讀者退出時,--m,若m=0,說明這是最後乙個讀者,則設定讀完事件觸發。

在改變m的操作應該是互斥操作,要加鎖。若有多個寫者呢,寫者之間也是互斥的,所以還要再加乙個寫者鎖。

互斥量(算上臨界區)和事件(包含上訊號量)的區別和聯絡:總是感覺這2者之間的界限很模糊,若沒有執行緒所有權的話,不是可以互換了嗎?仔細想想好像確實是這樣的。事件是觸發後,可通知其他執行緒這個事件觸發了,可以進行下面的動作了,而互斥量也有同樣的作用。不過,互斥量的話,一旦wait到立即鎖住,其他執行緒就只能繼續等了。但是若事件不是自動事件(即wait後立即設定為未觸發)的話,所有等待的執行緒都能執行起來。這樣想的話,

事件一般用於控制線程的先後順序,而mutex一般用於排他的訪問資源

。還能這樣理解,互斥量可理解為鎖,一時刻,只能乙個執行緒獨佔。而事件就是發出乙個訊息推送,收到訊息的執行緒進行下一步,當然若是自動事件的話就變成了和鎖乙個的功能了。

多執行緒操作小結

因為人們對多工作業系統的需求,需要程式能多程序執行,而多執行緒操作正好滿足這一要求,建立執行緒有兩種方式1,將類宣告為thread 的子類 2,實現介面runnable 3.執行緒的開始用start public class threadtest extends thread catch inter...

多執行緒小結(3)

多執行緒 join 方法 當乙個執行緒操作需要等待另乙個執行緒執行完畢之後才能繼續進行時,使用join 方法。join方法會等到使用該方法的執行緒結束後再執行下面的 就是當a執行緒,要等到b執行緒完成之後再執行a的話,就用到join方法了。因為是得等到b執行緒先執行,所以是 b.join join是...

多執行緒小結(2)

1 private static thread subthread 2private static thread subthread1 3static void main string args 418 19static void getshow 2025 26static void getshow...