一、用乙個初始函式建立乙個執行緒
直接看**:注意c++在執行乙個可執行程式的時候(建立了乙個程序),會自動的建立乙個主線程,這個主線程和程序同生共死,主線程結束,程序也就結束了。
1 #include "pch.h"thread mythread1(print1)建立乙個執行緒mythread1,print1()是該執行緒的初始函式(執行函式)。2 #include 3 #include4 void print1()
5 10 using namespace std;
11 int main()
12
mythread1.join();阻塞主線程,等待mythread1這個執行緒執行完畢在繼續執行,推薦這種做法。
mythread1.detach();分離,使主線程和執行緒mythread1分離,主線程可以先執行結束,如果主線程執行完了,子執行緒會在c++後台執行,一旦使用detach(),與這個子執行緒關聯的物件會失去對這個主線程的關聯,此時這個子執行緒會駐留在c++後台執行,當主線程執行完畢結束,子執行緒會移交給c++執行時庫管理,這個執行時庫會清理與這個執行緒相關的資源(守護執行緒),detach()會是子執行緒失去程序的控制,所以建議不要使用detach(),建議使用jion()。
return 0;表示主線程執行完畢,表明程序即將退出。
直接看**:
1 #include "pch.h"thread mythread2(t);呼叫了拷貝建構函式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
mythread2.detach();情況一的時候,這裡絕對不能用detach(),因為類成員變數是乙個引用,這裡的itm等主線程執行完畢之後記憶體會**,所以子執行緒列印的變數無效,這是乙個重大的bug。一定要注意,最安全的做法就是直接使用值傳遞,生成乙個副本,這樣使用detach()就不會有錯。
這裡還有乙個疑問?為什麼使用detach(),主線程執行結束之後,用t這個區域性物件沒有問題,t按理說會被系統**之後就有問題了呀?
答:雖然t這個物件不在了(肯定會被**),但是建立子執行緒的時候,這個物件t是被拷貝到子執行緒中去了的,所以用detach()而且主線程執行完畢後,子執行緒還是會繼續執行,這是沒有問題的.t被銷毀,但是被複製到執行緒中去的物件依然存在。
直接看**:
1 #include 2 #include3 using namespace std;joinable(),這個函式用來判斷是否還可以使用join()和detach(),如果已經使用了join()或者detach(),則不能再使用detach()或者join()函式了,會返回乙個布林true,反之,返回乙個false.4 int main()
5 ;12 thread mythread3(mylamthread);
13 mythread3.join();
14 cout << "主線程執行結束" << endl;
15 return 0;//表示主線程執行結束,表明程序結束
16 }
你只管努力,剩下的交給天意!
直接看**:注意c++在執行乙個可執行程式的時候(建立了乙個程序),會自動的建立乙個主線程,這個主線程和程序同生共死,主線程結束,程序也就結束了。
1 #include "pch.h"thread mythread1(print1)建立乙個執行緒mythread1,print1()是該執行緒的初始函式(執行函式)。2 #include 3 #include4 void print1()
5 10 using namespace std;
11 int main()
12
mythread1.join();阻塞主線程,等待mythread1這個執行緒執行完畢在繼續執行,推薦這種做法。
mythread1.detach();分離,使主線程和執行緒mythread1分離,主線程可以先執行結束,如果主線程執行完了,子執行緒會在c++後台執行,一旦使用detach(),與這個子執行緒關聯的物件會失去對這個主線程的關聯,此時這個子執行緒會駐留在c++後台執行,當主線程執行完畢結束,子執行緒會移交給c++執行時庫管理,這個執行時庫會清理與這個執行緒相關的資源(守護執行緒),detach()會是子執行緒失去程序的控制,所以建議不要使用detach(),建議使用jion()。
return 0;表示主線程執行完畢,表明程序即將退出。
直接看**:
1 #include "pch.h"thread mythread2(t);呼叫了拷貝建構函式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
mythread2.detach();情況一的時候,這裡絕對不能用detach(),因為類成員變數是乙個引用,這裡的itm等主線程執行完畢之後記憶體會**,所以子執行緒列印的變數無效,這是乙個重大的bug。一定要注意,最安全的做法就是直接使用值傳遞,生成乙個副本,這樣使用detach()就不會有錯。
這裡還有乙個疑問?為什麼使用detach(),主線程執行結束之後,用t這個區域性物件沒有問題,t按理說會被系統**之後就有問題了呀?
答:雖然t這個物件不在了(肯定會被**),但是建立子執行緒的時候,這個物件t是被拷貝到子執行緒中去了的,所以用detach()而且主線程執行完畢後,子執行緒還是會繼續執行,這是沒有問題的.t被銷毀,但是被複製到執行緒中去的物件依然存在。
直接看**:
1 #include 2 #include3 using namespace std;joinable(),這個函式用來判斷是否還可以使用join()和detach(),如果已經使用了join()或者detach(),則不能再使用detach()或者join()函式了,會返回乙個布林true,反之,返回乙個false.4 int main()
5 ;12 thread mythread3(mylamthread);
13 mythread3.join();
14 cout << "主線程執行結束" << endl;
15 return 0;//表示主線程執行結束,表明程序結束
16 }
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...