C 中的執行緒同步 Join方法的使用例項

2021-09-21 15:48:56 字數 4847 閱讀 7945

最近需要解決乙個多執行緒問題,將這個問題抽象說來就是這個情況。

有a b兩個方法同時完成f工作,a b操作均比較耗時,且 b操作需要a操作完成後才能執行。

現 要 a 和b同時執行n個執行緒。

用數學化的語言描述一下

/*************************** 

* 現有執行緒 a1,a2……ai……ak 

* 執行緒b1,b2,b3……bi……bk 

* ai和bi需要順序執行,共同完成f操作 

* ai和bi+1之間無干擾 

* bi和bi+1之間無干擾 

* ai和bi+1之間無干擾 

* a b操作都比較耗時 

************************/

最初在思考解決方案的時候,想的是 為每一a設定乙個標記位,去記錄 當前的ai所處的狀態,然後再bi中去迴圈訪問ai的該標記,如果標記表示可執行bi,則跳出迴圈,執行bi操作。

想來這種方案應該也能實現,但又想到c#提供的join方法,剛好就是解決t2執行緒執行前需要等待t1完成的問題而給出的,恰好可以利用,處理起來應該會更簡單,更安全。

join方法是指將指定的執行緒合併到當前執行緒中,最初學的時候很不清楚這個合併是什麼意思,現在看來應該就是 類似與在 原有的t2一塊木板(當前執行緒)上的某個位置出 拼上 t1木板(指定執行緒),這樣,執行t2木板是,合併上的t1那一塊也就成為了必經的路程。

join方法還提供了join的時間,以免 t1操作過久,導致一直等待下去。如 t2.join(100);

考慮上面的問題,由於 ai和bi 之間才有同步關係,所以 需要處理就是這乙個對應,join的時候只要找到bi對應的ai執行緒即可

故,我為在整個類中儲存兩個了靜態的 字典 dictionary前乙個 表示該執行緒的索引,=後乙個表示該執行緒本身

源**如下:

1  2  

public

class

aibithread

3  18 

19 //

建立多個b執行緒

20 for

(inti=

0;i<20;

i++)

21 26 

console

.readline()

;27 

}28 

29 public

voida(

objecti)

30 36 

37 public

voidb(

objecti)

38 49 }

然後再main中呼叫start方法,整個模擬完畢,輸出結果如下:

進入執行緒a--0 

進入執行緒a--1 

執行緒a--1正在執行 

進入執行緒a--2 

執行緒a--2正在執行 

進入執行緒a--3 

執行緒a--3正在執行 

進入執行緒a--4 

執行緒a--4正在執行 

執行緒a--0正在執行 

進入執行緒a--5 

執行緒a--5正在執行 

進入執行緒a--6 

執行緒a--6正在執行 

進入執行緒a--7 

執行緒a--7正在執行 

進入執行緒a--8 

執行緒a--8正在執行 

進入執行緒a--9 

執行緒a--9正在執行 

進入執行緒a--10 

執行緒a--10正在執行 

進入執行緒a--11 

執行緒a--11正在執行 

進入執行緒a--12 

執行緒a--12正在執行 

進入執行緒a--13 

執行緒a--13正在執行 

進入執行緒a--14 

執行緒a--14正在執行 

進入執行緒a--15 

執行緒a--15正在執行 

進入執行緒a--16 

執行緒a--16正在執行 

進入執行緒a--17 

執行緒a--17正在執行 

進入執行緒a--18 

執行緒a--18正在執行 

進入執行緒a--19 

執行緒a--19正在執行 

進入執行緒b--0 

正在等待執行緒a--0 

進入執行緒b--1 

正在等待執行緒a--1 

進入執行緒b--2 

正在等待執行緒a--2 

進入執行緒b--3 

正在等待執行緒a--3 

進入執行緒b--4 

正在等待執行緒a--4 

進入執行緒b--5 

正在等待執行緒a--5 

進入執行緒b--6 

正在等待執行緒a--6 

進入執行緒b--7 

進入執行緒b--8 

正在等待執行緒a--8 

正在等待執行緒a--7 

進入執行緒b--9 

正在等待執行緒a--9 

進入執行緒b--10 

正在等待執行緒a--10 

進入執行緒b--12 

正在等待執行緒a--12 

進入執行緒b--11 

進入執行緒b--13 

正在等待執行緒a--13 

進入執行緒b--15 

正在等待執行緒a--15 

進入執行緒b--14 

正在等待執行緒a--14 

進入執行緒b--16 

正在等待執行緒a--11 

正在等待執行緒a--16 

進入執行緒b--18 

正在等待執行緒a--18 

進入執行緒b--17 

進入執行緒b--19 

正在等待執行緒a--17 

正在等待執行緒a--19 

執行緒a--2要結束了 

等待執行緒a--2等待完畢!! 

執行緒b--2繼續執行 

執行緒a--1要結束了 

執行緒a--0要結束了 

執行緒a--8要結束了 

執行緒a--10要結束了 

執行緒a--4要結束了 

執行緒a--11要結束了 

執行緒a--6要結束了 

等待執行緒a--0等待完畢!! 

等待執行緒a--8等待完畢!! 

執行緒a--12要結束了 

等待執行緒a--10等待完畢!! 

等待執行緒a--4等待完畢!! 

執行緒a--14要結束了 

執行緒a--3要結束了 

執行緒a--7要結束了 

執行緒a--5要結束了 

等待執行緒a--1等待完畢!! 

執行緒a--9要結束了 

執行緒a--13要結束了 

執行緒a--15要結束了 

執行緒a--17要結束了 

等待執行緒a--11等待完畢!! 

執行緒a--16要結束了 

等待執行緒a--6等待完畢!! 

執行緒b--0繼續執行 

執行緒a--18要結束了 

執行緒b--8繼續執行 

等待執行緒a--12等待完畢!! 

執行緒b--10繼續執行 

執行緒b--4繼續執行 

等待執行緒a--14等待完畢!! 

執行緒a--19要結束了 

等待執行緒a--3等待完畢!! 

等待執行緒a--7等待完畢!! 

等待執行緒a--5等待完畢!! 

執行緒b--1繼續執行 

等待執行緒a--9等待完畢!! 

執行緒b--11繼續執行 

等待執行緒a--13等待完畢!! 

等待執行緒a--15等待完畢!! 

等待執行緒a--17等待完畢!! 

等待執行緒a--16等待完畢!! 

執行緒b--6繼續執行 

等待執行緒a--18等待完畢!! 

執行緒b--2要結束了 

執行緒b--12繼續執行 

執行緒b--14繼續執行 

等待執行緒a--19等待完畢!! 

執行緒b--3繼續執行 

執行緒b--7繼續執行 

執行緒b--5繼續執行 

執行緒b--9繼續執行 

執行緒b--13繼續執行 

執行緒b--15繼續執行 

執行緒b--17繼續執行 

執行緒b--16繼續執行 

執行緒b--18繼續執行 

執行緒b--19繼續執行 

執行緒b--0要結束了 

執行緒b--8要結束了 

執行緒b--10要結束了 

執行緒b--4要結束了 

執行緒b--1要結束了 

執行緒b--11要結束了 

執行緒b--6要結束了 

執行緒b--12要結束了 

執行緒b--14要結束了 

執行緒b--3要結束了 

執行緒b--7要結束了 

執行緒b--5要結束了 

執行緒b--9要結束了 

執行緒b--13要結束了 

執行緒b--17要結束了 

執行緒b--15要結束了 

執行緒b--19要結束了 

執行緒b--16要結束了 

執行緒b--18要結束了

驗證 原來提出的要求

1. ai和bi需要順序執行

檢視a2和b2的執行過程情況 依次是  

進入執行緒a—2    執行緒a--2正在執行   進入執行緒b—2  正在等待執行緒a—2  執行緒a--2要結束了     等待執行緒a--2等待完畢!!   執行緒b--2繼續執行    執行緒b--2要結束了

驗證通過

2. ai 和bi+1 無干擾

檢視 a4 和b 5 狀態,二者之間無干擾

3.ai 和ai+1無干擾,檢視 a9 和a 8 狀態

4.bi 和bi+1無干擾,檢視 b9 和b 8 狀態

備註 :(其實嚴格說來 2,3,4 通過這一組資料是得不出這樣的結果的,應該是多組資料進行觀察。上述234結論只能說是理論分析得來。)

原問題順利解決。

執行緒中的join的問題就暫時說到這裡。

執行緒中的join 方法

作用 join 方法的作用就是讓主線程等待子執行緒執行結束之後再執行主線程。public class father catch interruptedexception e static class son extends thread override public void run system...

執行緒中的join 方法

作用 join 方法的作用就是讓主線程等待子執行緒執行結束之後再執行主線程。public class father catch interruptedexception e static class son extends thread override public void run system...

C 執行緒的Join方法

在.net中,join方法主要是用來阻塞呼叫執行緒,直到某個執行緒終止或經過了指定時間為止。join方法的宣告如下 public void join public bool join int millisecondstimeout public bool join timespan timeout ...