一:概述
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...