一:概述
C++11引入了thread類,大大降低了多線程使用的復雜度,原先使用多線程只能用系統的API,無法解決跨平臺問題,一套代碼平臺移植,對應多線程代碼也必須要修改?,F在在C++11中只需使用語言層面的thread可以解決這個問題。
所需頭文件<thread>
二:構造函數
1.默認構造函數
2.初始化構造函數
template<class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
創建std::thread執行對象,線程調用threadFun函數,函數參數為args。
void threadFun(int a)
{
cout << "this is thread fun !" << endl;
}
thread t1(threadFun, 2);
3.拷貝構造函數
thread(const thread&) = delete;
拷貝構造函數被禁用,std::thread對象不可拷貝構造
void threadFun(int& a)
{
cout << "this is thread fun !" << endl;
}
int value = 2;
thread t1(threadFun, std::ref(value));
4.Move構造函數
thread(thread&& x)noexcept
調用成功原來x不再是std::thread對象
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();
三:成員函數
1.get_id()
獲取線程ID,返回類型std::thread::id對象。
thread t1(threadFun); thread::id threadId = t1.get_id(); cout << "線程ID:" << threadId << endl; //threadId轉換成整形值,所需頭文件<sstream> ostringstream oss; oss << t1.get_id(); string strId = oss.str(); unsigned long long tid = stoull(strId); cout << "線程ID:" << tid << endl;
2.join()
創建線程執行線程函數,調用該函數會阻塞當前線程,直到線程執行完join才返回。
thread t1(threadFun); t1.join() //阻塞等待
3.detach()
detach調用之后,目標線程就成為了守護線程,駐留后臺運行,與之關聯的std::thread對象失去對目標線程的關聯,無法再通過std::thread對象取得該線程的控制權。
4.swap()
交換兩個線程對象
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()
獲得邏輯處理器儲量,返回值為int型
int coreNum = thread::hardware_concurrency();
四:使用
1.創建線程
void threadFun1()
{
cout << "this is thread fun1 !" << endl;
}
int main()
{
thread t1(threadFun1);
t1.join();
getchar();
return 1;
}
2.創建線程,傳參
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 做變量傳遞時并不是引用,而是對變量做了拷貝,所以在傳遞給int v前,int value不能出作用域(釋放了內存),join(),可以保證int value變量釋放內存,如果使用detach(),可能存在這種情況。
3.創建線程,引用傳參
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.創建建線程,線程函數為類成員函數
class Object
{
public:
Object()
{
cout << "構造函數" << endl;
}
~Object()
{
cout << "析構函數" << endl;
}
void fun(string info)
{
cout << info << endl;
}
};
int main()
{
Object obj;
string str = "我是一個類的成員函數!";
thread t1(&Object::fun, &obj, str);
t1.join();
getchar();
return 1;
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。