理解多執行緒(二)
阿新 • • 發佈:2018-12-28
前言
上篇已經講到,執行緒間的同步,和執行緒訪問公用資料安全是存在問題的。這篇主要理解C++11標準上處理這些問題的方法。
std::thread
c++通過std:thread操作執行緒,因此使用 std::thread 時需要包含 #include 標頭檔案。
建構函式
thread();//預設建構函式,沒有執行的例項物件
thread (fun,_1,_2,...)//初始化建構函式,有執行的例項物件,可以傳遞普通函式,類方法,lambda表示式
thread(const thread&);//複製建構函式,已經刪除該構造方法
thread(thread && x);//move建構函式 ,只能給已經分配了執行例項物件的執行緒構造,且構造後原來的執行緒物件就不能使用。
棧上:
std::thread t1(fun);
std::thread th[3]{thread(fun), thread(fun), thread(fun)};
堆上:
std::thread * t1(new std::thread(fun));
std::thread *pth(new std::thread[3]{ std::thread(fun), std::thread(fun), std::thread(fun) });
賦值
只支援move賦值,也是隻能是分配了例項物件的執行緒賦值,且賦值後,原來的執行緒物件不能使用
std::thread t1();
std::thread t2(fun);
std::thread t3 = std::move(t2);
std::thread t3 = std::move(t1);//error
成員函式
join:
主執行緒阻塞等待子執行緒完成後釋放子執行緒資源,再繼續進行,如果不加join,主執行緒不等待,會報錯。
std::thread t2(mythread);
t2.join();
joinable:
檢查執行緒是否可被 join,是否是活躍的執行緒物件
if (t1.joinable()) t1.join();
get_id:
獲取執行緒 ID,返回一個型別為 std::thread::id 的物件
std::thread::id t1_id = t1.get_id();
detach:
將當前執行緒物件所代表的執行例項與該執行緒物件分離,使得執行緒的執行可以單獨進行,。一旦執行緒執行完畢,它所分配的資源將會被釋放。
swap:
交換兩個執行緒物件所代表的底層控制代碼,即id.
std::swap(t1, t2);
t1.swap(t2);
hardware_concurrency:
獲得電腦cpu核心數量
auto a=std::thread::hardware_concurrency();
std::this_thread 名稱空間
get_id: 獲取執行緒 ID。
yield: 暫停當前的執行緒執行。
do {
std::this_thread::yield();
} while (//do something);
sleep_until: 執行緒sleep到某個時間點重新喚醒。sleep1秒
auto a = std::chrono::high_resolution_clock::now() + std::chrono::microseconds(1000);
std::this_thread::sleep_until(a);
sleep_for: 執行緒休眠某個指定的時間段,該執行緒才被重新喚醒。sleep1秒
std::this_thread::sleep_for(std::chrono::microseconds(1000));
最後
瞭解了基本的執行緒使用,執行緒的同步可以使用join實現,甚至std::this_thread的sleep也能粗略的同步。後面是執行緒的互斥量,訊號量來實現執行緒資料的安全訪問。