C 11併發程式設計 多執行緒std thread

2022-10-04 00:06:29 字數 2309 閱讀 4558

一:概述

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

所需標頭檔案

二:建構函式

1.預設建構函式

2.初始化建構函式

template

explicit thread(fn&& fn, args&&... args);

建立std::thread執行物件,執行緒呼叫threadfun函式,函式引數為args。

void threadfun(int a)

thread t1(threadfun, 2);

3.拷貝建構函式

thread(const thread&) = delete;

拷貝建構函式被禁用,std::thread物件不可拷貝構造

void threadfun(int& a)

int value = 2;

thread t1(threadfun, std::ref(value));

4.move建構函式

thread(thread&& x)noexcept

呼叫成功原來x不再是std::thread物件

void threadfun(int& a)

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轉換成整形值,所需標頭檔案

ostringstream oss;

oss << t1.get_id();

string strid = oss.str();

unsigned long long tid = stoull(strid);

c << "執行緒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()

int main()

2.建立執行緒,傳參

void threadfun1(int v)

int main()

需要注意,變數int value 和int v 做變數傳遞時並不是引用,而是對變數做了拷貝,所以在傳遞給int v前,int value不能出作用域(釋放了記憶體),join(),可以保證int value變數釋放記憶體,如果使用detach(),可能存在這種情況。

3.建立執行緒,引用傳參

void threadfun1(int& v)

jtpbyn

int main()

4.建立建執行緒,執行緒函式為類成員函式

class object

~object()

void fun(string info)

};int main()

總結

C 11併發程式設計 多執行緒std thread

c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...

C 11 多執行緒 併發程式設計總結

建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...

C 11 併發 多執行緒

通常情況下,原子操作是通過互斥 mutual exclusive 的訪問來保證的。linux下借助posix標準的pthread庫的互斥鎖 include include using namespace std static long long total 0 pthread mutex t m p...