C++11并發(fā)編程:多線程std::thread
一:概述
C++11引入了thread類,大大降低了多線程使用的復(fù)雜度,原先使用多線程只能用系統(tǒng)的API,無(wú)法解決跨平臺(tái)問(wèn)題,一套代碼平臺(tái)移植,對(duì)應(yīng)多線程代碼也必須要修改。現(xiàn)在在C++11中只需使用語(yǔ)言層面的thread可以解決這個(gè)問(wèn)題。
所需頭文件<thread>
二:構(gòu)造函數(shù)
1.默認(rèn)構(gòu)造函數(shù)
- thread() noexcept
- 一個(gè)空的std::thread執(zhí)行對(duì)象
2.初始化構(gòu)造函數(shù)
template<class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
創(chuàng)建std::thread執(zhí)行對(duì)象,線程調(diào)用threadFun函數(shù),函數(shù)參數(shù)為args。
void threadFun(int a) { cout << "this is thread fun !" << endl; } thread t1(threadFun, 2);
3.拷貝構(gòu)造函數(shù)
thread(const thread&) = delete;
拷貝構(gòu)造函數(shù)被禁用,std::thread對(duì)象不可拷貝構(gòu)造
void threadFun(int& a) { cout << "this is thread fun !" << endl; } int value = 2; thread t1(threadFun, std::ref(value));
4.Move構(gòu)造函數(shù)
thread(thread&& x)noexcept
調(diào)用成功原來(lái)x不再是std::thread對(duì)象
void threadFun(int& a) { cout << "this is thread fun !" << endl; } int value = 2; thread t1(threadFun, std::ref(value)); thread t2(std::move(t1)); t2.join();
三:成員函數(shù)
1.get_id()
獲取線程ID,返回類型std::thread::id對(duì)象。
thread t1(threadFun); thread::id threadId = t1.get_id(); cout << "線程ID:" << threadId << endl; //threadId轉(zhuǎn)換成整形值,所需頭文件<sstream> ostringstream oss; oss << t1.get_id(); string strId = oss.str(); unsigned long long tid = stoull(strId); cout << "線程ID:" << tid << endl;
2.join()
創(chuàng)建線程執(zhí)行線程函數(shù),調(diào)用該函數(shù)會(huì)阻塞當(dāng)前線程,直到線程執(zhí)行完join才返回。
thread t1(threadFun); t1.join() //阻塞等待
3.detach()
detach調(diào)用之后,目標(biāo)線程就成為了守護(hù)線程,駐留后臺(tái)運(yùn)行,與之關(guān)聯(lián)的std::thread對(duì)象失去對(duì)目標(biāo)線程的關(guān)聯(lián),無(wú)法再通過(guò)std::thread對(duì)象取得該線程的控制權(quán)。
4.swap()
交換兩個(gè)線程對(duì)象
thread t1(threadFun1); thread t2(threadFun2); cout << "線程1的ID:" << t1.get_id() << endl; cout << "線程2的ID:" << t2.get_id() << endl; t1.swap(t2); cout << "線程1的ID:" << t1.get_id() << endl; cout << "線程2的ID:" << t2.get_id() << endl;
5.hardware_concurrency()
獲得邏輯處理器儲(chǔ)量,返回值為int型
int coreNum = thread::hardware_concurrency();
四:使用
1.創(chuàng)建線程
void threadFun1() { cout << "this is thread fun1 !" << endl; } int main() { thread t1(threadFun1); t1.join(); getchar(); return 1; }
2.創(chuàng)建線程,傳參
void threadFun1(int v) { cout << "this is thread fun1 !" << endl; cout << v << endl; } int main() { int value = 6; thread t1(threadFun1, value); t1.join(); getchar(); return 1; }
需要注意,變量int value 和int v 做變量傳遞時(shí)并不是引用,而是對(duì)變量做了拷貝,所以在傳遞給int v前,int value不能出作用域(釋放了內(nèi)存),join(),可以保證int value變量釋放內(nèi)存,如果使用detach(),可能存在這種情況。
3.創(chuàng)建線程,引用傳參
void threadFun1(int& v) { cout << "this is thread fun1 !" << endl; cout << v << endl; } int main() { int value = 6; thread t1(threadFun1, std::ref(value)); t1.join(); getchar(); return 1; }
4.創(chuàng)建建線程,線程函數(shù)為類成員函數(shù)
class Object { public: Object() { cout << "構(gòu)造函數(shù)" << endl; } ~Object() { cout << "析構(gòu)函數(shù)" << endl; } void fun(string info) { cout << info << endl; } }; int main() { Object obj; string str = "我是一個(gè)類的成員函數(shù)!"; thread t1(&Object::fun, &obj, str); t1.join(); getchar(); return 1; }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法
這篇文章主要介紹了剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++實(shí)現(xiàn)簡(jiǎn)單版圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單版圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06基于QT5實(shí)現(xiàn)一個(gè)時(shí)鐘桌面
這篇文章主要介紹了利用QT5實(shí)現(xiàn)的一個(gè)時(shí)鐘桌面,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下2022-01-01C語(yǔ)言編程動(dòng)態(tài)內(nèi)存分配常見(jiàn)錯(cuò)誤全面分析
這篇文章主要介紹了C語(yǔ)言編程中動(dòng)態(tài)內(nèi)存分配的常見(jiàn)錯(cuò)誤全面分析講解,同樣遇到過(guò)C語(yǔ)言動(dòng)態(tài)內(nèi)存分配各種問(wèn)題的同學(xué)可以借鑒參考下,希望能夠有所幫助2021-10-10Qt實(shí)戰(zhàn)之實(shí)現(xiàn)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)簡(jiǎn)易的圖片瀏覽器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算
這篇文章主要介紹了c++將數(shù)組名作為函數(shù)參數(shù)對(duì)數(shù)組元素進(jìn)行相應(yīng)的運(yùn)算,需要的朋友可以參考下2014-05-05