C 11執行緒建立的三種方法

2022-07-24 18:21:13 字數 3614 閱讀 2303

一、用乙個初始函式建立乙個執行緒

直接看**:注意c++在執行乙個可執行程式的時候(建立了乙個程序),會自動的建立乙個主線程,這個主線程和程序同生共死,主線程結束,程序也就結束了。

1 #include "pch.h"

2 #include 3 #include4 void print1()

5 10 using namespace std;

11 int main()

12

thread mythread1(print1)建立乙個執行緒mythread1,print1()是該執行緒的初始函式(執行函式)。

mythread1.join();阻塞主線程,等待mythread1這個執行緒執行完畢在繼續執行,推薦這種做法。

mythread1.detach();分離,使主線程和執行緒mythread1分離,主線程可以先執行結束,如果主線程執行完了,子執行緒會在c++後台執行,一旦使用detach(),與這個子執行緒關聯的物件會失去對這個主線程的關聯,此時這個子執行緒會駐留在c++後台執行,當主線程執行完畢結束,子執行緒會移交給c++執行時庫管理,這個執行時庫會清理與這個執行緒相關的資源(守護執行緒),detach()會是子執行緒失去程序的控制,所以建議不要使用detach(),建議使用jion()。

return 0;表示主線程執行完畢,表明程序即將退出。

直接看**:

1 #include "pch.h"

2 #include 3 #include4 class t

5 13 */

14 //不能用引用,應該像下面這樣用

15 int it;

16 t(int m_it) :it(m_it)

17

20 t(const t &t) :it(t.it)

23 ~t()

24

27 void operator()()

28

31 };

32 int main()

33

thread mythread2(t);呼叫了拷貝建構函式

mythread2.detach();情況一的時候,這裡絕對不能用detach(),因為類成員變數是乙個引用,這裡的itm等主線程執行完畢之後記憶體會**,所以子執行緒列印的變數無效,這是乙個重大的bug。一定要注意,最安全的做法就是直接使用值傳遞,生成乙個副本,這樣使用detach()就不會有錯。

這裡還有乙個疑問?為什麼使用detach(),主線程執行結束之後,用t這個區域性物件沒有問題,t按理說會被系統**之後就有問題了呀?

答:雖然t這個物件不在了(肯定會被**),但是建立子執行緒的時候,這個物件t是被拷貝到子執行緒中去了的,所以用detach()而且主線程執行完畢後,子執行緒還是會繼續執行,這是沒有問題的.t被銷毀,但是被複製到執行緒中去的物件依然存在。

直接看**:

1 #include 2 #include3 using namespace std;

4 int main()

5 ;12 thread mythread3(mylamthread);

13 mythread3.join();

14 cout << "主線程執行結束" << endl;

15 return 0;//表示主線程執行結束,表明程序結束

16 }

joinable(),這個函式用來判斷是否還可以使用join()和detach(),如果已經使用了join()或者detach(),則不能再使用detach()或者join()函式了,會返回乙個布林true,反之,返回乙個false.

你只管努力,剩下的交給天意!

直接看**:注意c++在執行乙個可執行程式的時候(建立了乙個程序),會自動的建立乙個主線程,這個主線程和程序同生共死,主線程結束,程序也就結束了。

1 #include "pch.h"

2 #include 3 #include4 void print1()

5 10 using namespace std;

11 int main()

12

thread mythread1(print1)建立乙個執行緒mythread1,print1()是該執行緒的初始函式(執行函式)。

mythread1.join();阻塞主線程,等待mythread1這個執行緒執行完畢在繼續執行,推薦這種做法。

mythread1.detach();分離,使主線程和執行緒mythread1分離,主線程可以先執行結束,如果主線程執行完了,子執行緒會在c++後台執行,一旦使用detach(),與這個子執行緒關聯的物件會失去對這個主線程的關聯,此時這個子執行緒會駐留在c++後台執行,當主線程執行完畢結束,子執行緒會移交給c++執行時庫管理,這個執行時庫會清理與這個執行緒相關的資源(守護執行緒),detach()會是子執行緒失去程序的控制,所以建議不要使用detach(),建議使用jion()。

return 0;表示主線程執行完畢,表明程序即將退出。

直接看**:

1 #include "pch.h"

2 #include 3 #include4 class t

5 13 */

14 //不能用引用,應該像下面這樣用

15 int it;

16 t(int m_it) :it(m_it)

17

20 t(const t &t) :it(t.it)

23 ~t()

24

27 void operator()()

28

31 };

32 int main()

33

thread mythread2(t);呼叫了拷貝建構函式

mythread2.detach();情況一的時候,這裡絕對不能用detach(),因為類成員變數是乙個引用,這裡的itm等主線程執行完畢之後記憶體會**,所以子執行緒列印的變數無效,這是乙個重大的bug。一定要注意,最安全的做法就是直接使用值傳遞,生成乙個副本,這樣使用detach()就不會有錯。

這裡還有乙個疑問?為什麼使用detach(),主線程執行結束之後,用t這個區域性物件沒有問題,t按理說會被系統**之後就有問題了呀?

答:雖然t這個物件不在了(肯定會被**),但是建立子執行緒的時候,這個物件t是被拷貝到子執行緒中去了的,所以用detach()而且主線程執行完畢後,子執行緒還是會繼續執行,這是沒有問題的.t被銷毀,但是被複製到執行緒中去的物件依然存在。

直接看**:

1 #include 2 #include3 using namespace std;

4 int main()

5 ;12 thread mythread3(mylamthread);

13 mythread3.join();

14 cout << "主線程執行結束" << endl;

15 return 0;//表示主線程執行結束,表明程序結束

16 }

joinable(),這個函式用來判斷是否還可以使用join()和detach(),如果已經使用了join()或者detach(),則不能再使用detach()或者join()函式了,會返回乙個布林true,反之,返回乙個false.

iOS 建立多執行緒的三種方法

1 通過nsobject的方法建立執行緒 這個方法會自動開闢乙個後台執行緒,引數1 在這個後台執行緒中執行的方法,引數2 用於傳遞引數 self performselectorinbackground selector banzhuanplus withobject nil 第一步 建立執行緒 ns...

Java建立執行緒Thread的三種方法

1.通過繼承thread類建立執行緒 1 繼承thread類,重寫run 方法 2 建立繼承了thread類的類的物件,呼叫物件的start方法開啟執行緒 2.通過實現runnable介面建立執行緒 1 實現runnable介面,重寫run 方法 2 建立實現了runnable介面的類的物件,將物件...

建立執行緒的三種方法詳細對比

1 繼承thread類 步驟 定義類繼承thread 複寫thread類中的run方法 目的 將自定義 儲存在run方法,讓執行緒執行 呼叫執行緒的start方法 該方法有兩步 啟動執行緒,呼叫run方法。1 public class threaddemo1 15 16 17 繼承thread類 1...