併發,執行緒,程序
阿新 • • 發佈:2018-11-21
一個是實力的體現,一個是商用的必須需求。
以往:
windows: CreatThread(),_beginthred(),_beginthredexe()
Linux: pthread_create() 建立執行緒
臨界區,互斥量。以往多執行緒程式碼不能跨平臺。
從C++11開始,C++語言本身增加可移植性。
整個程序是否執行完畢的標誌是主執行緒是否執行完畢。此時,如果主執行緒執行完畢,但是其他子執行緒還沒有執行完畢,那麼,這些子執行緒也會被作業系統強行終止。
1.包含標頭檔案:
#include<thread>
2.建立一個執行緒函式
void myprint() { cout << "執行緒開始執行" << endl; //... //... //... cout << "執行緒執行完畢" << endl; }
3.main中開始寫程式碼
std::thread mythread(myprint);
mythread.join();//阻塞主執行緒,讓主執行緒等待
傳統多執行緒:等待子執行緒執行完畢,然後自己最後在退出。
detach():主執行緒可以不等子執行緒執行完畢,就結束程式。此時子執行緒跑到系統的後臺執行,相當於被C++執行時庫接管,當這個子執行緒執行完成後,由執行時庫負責清理相關資源。
一旦detach(),就不能join(),否則會出現異常。
void myprint() { cout << "執行緒開始執行" << endl; cout << "1" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; cout << "執行緒執行完畢" << endl; } std::thread mythread(myprint); mythread.detach();//一起列印,但是主執行緒完畢後,就結束程式 cout << "hello world" << endl;
joinable():判斷能不能使用join或detach。
std::thread mythread(myprint);
if(mythread.joinable())
mythread.join();
else
mythread.detach();
cout << "hello world" << endl;
執行緒引數:當執行緒引入引數時,是以複製的形式,
class T { int i; public: T(int j):i(j) { cout << "建構函式執行" << endl; } T(const T &j) { i = j.i; cout << "拷貝建構函式執行" << endl; } void operator()() { cout << "i=" << i << endl; } ~T() { cout << "解構函式執行" << endl; } };
auto thread = [] {
cout << "執行緒開始執行" << endl;
};
std::thread mythread(thread);
if(mythread.joinable())
mythread.join();
else
mythread.detach();
cout << "hello world" << endl;