當前位置:
首頁 > 知識 > C++11並發編程:多線程std:thread

C++11並發編程:多線程std:thread

一:概述

C++11引入了thread類,大大降低了多線程使用的複雜度,原先使用多線程只能用系統的API,無法解決跨平台問題,一套代碼平台移植,對應多線程代碼也必須要修改。現在在C++11中只需使用語言層面的thread可以解決這個問題。

所需頭文件<thread>

二:構造函數

1.默認構造函數

thread() noexcept

一個空的std::thread執行對象

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;

---------------------

作者:蝸牛201

原文:https://blog.csdn.net/woniu211111/article/details/85123281

C++11並發編程:多線程std:thread

打開今日頭條,查看更多圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

C++中類成員的訪問控制許可權
發現JDK的3個bug

TAG:程序員小新人學習 |