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

2021-09-04 11:23:22 字數 2361 閱讀 4679

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

所需標頭檔案

thread() noexcept

乙個空的std::thread執行物件

template

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

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

void threadfun(int a)

thread t1(threadfun, 2);

thread(const thread&) = delete;

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

void threadfun(int& a)

int value = 2;

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

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();

獲取執行緒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);

cout << "執行緒id:" << tid << endl;

建立執行緒執行執行緒函式,呼叫該函式會阻塞當前執行緒,直到執行緒執行完join才返回。

thread t1(threadfun);

t1.join() //阻塞等待

detach呼叫之後,目標執行緒就成為了守護執行緒,駐留後台執行,與之關聯的std::thread物件失去對目標執行緒的關聯,無法再通過std::thread物件取得該執行緒的控制權。

交換兩個執行緒物件

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;

獲得邏輯處理器儲量,返回值為int型

int corenum = thread::hardware_concurrency();
void threadfun1()

int main()

void threadfun1(int v)

int main()

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

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

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

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

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

C 11 併發 多執行緒

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