C++多執行緒-第四篇-Thread_group(執行緒池)
阿新 • • 發佈:2019-01-06
thread_group--執行緒池
Thread_group用於管理一組執行緒,類似一個執行緒池,使用std::list<thread*>來榮納建立的thread物件
Thread_group類摘要
Class thread_group //不可拷貝 { Public: Thread * create_thread(F threadFunc); //建立新執行緒 Void add_thread(thread * thrd); //新增已有執行緒 Void remove_thread(thread* thrd); //刪除執行緒 Bool is_this_thread_in(); //當前執行緒是否在組內 Bool is_thread_in(thread * t); //指定的執行緒是否在組內 Void join_all(); //等待所有執行緒 Void interrupt_all(); //中斷所有執行緒 Int size(); //獲得執行緒數量 };
Create_thread()是工廠函式,可建立thread物件並執行,同時加入到內部LIST中,但他不支援傳遞函式引數,所以通常要用bind或者lambda來包裝執行的函式。
可以通過先建立執行緒物件,後加入執行緒池。
擴充套件:future+async()+promise+barrier+本地儲存
Future正規化提供了非同步操作執行緒返回值的方法,如此叫的原因是這個返回值線上程開始執行時還是不可用,是一個未來的期待值。
早期future == unique_future 即只能呼叫一次get(),他不能被多執行緒併發訪問。
而shared_future是其增強版,可多次執行緒安全的呼叫
Promise 配合thread使用,可作為函式的輸出引數,可以利用set_value/get_value傳出future.
Barrier是thread基於條件變數提供的另一種同步機制,可用於多個執行緒同步。
當直行至barrier時必須等待,直到所有執行緒都到達這個點才可以繼續。
Barrier又稱為rendezvous(約會地點)
本地儲存。引入原因:有用到區域性靜態變數或者全域性靜態變數的函式不可用於多執行緒環境,因為無法保證多執行緒變數在多執行緒環境下的重入時的正確性。
This_thread::at_thread_exit(function f)保證被此呼叫的函式線上程異常中斷時仍被呼叫。