前一篇沒用markdown編輯器感覺不好看,刪了重新發
本篇主要講述執行緒的管理,主要包括建立和使用執行緒
執行緒出現是為了執行任務,執行緒建立時會給乙個入口函式,當這個函式返回時,該執行緒就會退出,最常見的main()函式就是主線程的入口函式,在main()函式返回時主線程就結束了。
如何啟動乙個執行緒呢?就如上所述,需要給執行緒物件乙個入口函式。
#include #include using namespace std;
void hello()
int main()
例如:
#include #include #include #include using namespace std;
void hello()
int main()
這個**中線程執行的hello函式已經結束,依然可以join
在上面的**例子中,使用了執行緒物件的join函式,這個函式的作用就是等待執行緒完成。同時需要注意,乙個執行緒不能被join兩次。可以通過執行緒物件的joinable()函式判斷當前函式是否可以被join。
std::thread t(do_thread_work);
if(t.joinable())
t.join();
除了可以等待執行緒完成,還可以分離執行緒,讓執行緒自己執行,也就是所謂的在後台執行執行緒,當執行緒物件被銷毀後,執行緒可能仍在執行,此時,沒有直接的方法可以與其通訊,不能再通過執行緒物件獲取到該執行緒,也不能再被join,所以要注意資源的請求和釋放。
參照守護程序的概念,被分離的執行緒通常被稱作守護執行緒。
std::thread t(do_some_background_work);
t.detach();
assert(!t.joinable());
為了分離執行緒,執行緒物件必須與乙個執行緒相關聯,不能在沒有執行緒關聯的執行緒物件上使用detach(),join()函式也是同理,因此也可以使用joinable()函式來判斷當前函式是否可以detach。
std::thread t(my_function);
trycatch
t.join();
當然還有其他的做法,利用raii的思想,類似智慧型指標,對thread物件進行封裝。
#include #include class thread_guard
~thread_guard()
}private:
std::thread& t_;
};void hello()
int main()
執行緒的入口是個函式,作為使用者肯定是想傳遞一些函式引數的。操作也比較簡單,將額外的引數傳遞給std::thread的夠凹函式就可以了。但是,需要重視的一點是,引數預設上會被複製到內部儲存空間,然後在那新建立的執行緒可以訪問這些引數,即便函式中的相應引數期待著引用
這個意思就是說,傳遞引數給縣城函式就像是給普通函式傳遞引數一樣,預設傳遞的是形參,而且就算你加了引用,傳遞的也是形參。是std::thread的建構函式做的這個事情,他無視函式所期望的引用盲目的複製了所提供的值
解決方案也很簡單,使用std::ref()包裹你想要以引用傳遞的引數。
void update_data_for_widget(widget_id w, widget_data& data);
void fun(widget_id w)
和std::unique_ptr類似,std::thread是可移動並且非可複製的,這意味著一般不會有兩個執行緒物件指向同乙個執行緒例項,如果出現此情況會發生異常。如果同時給乙個執行緒物件關聯兩個執行緒例項,也會觸發異常。
void some_function();
void some_other_function();
std::thread t1(some_function);
std::thread t2 = std::move(t1);
t1 = std::thread(some_other_function);
t3 = std::move(t2);
t1 = std::move(t3); //此項操作將會終止程式!
執行緒識別符號是std: Java併發程式設計實戰筆記二(執行緒安全性)
當多個執行緒訪問某個類時,不管執行時採用何種排程方式或者執行緒如何交替執行,主調 中不需要任何額外的同步或協同 這個類始終都能表現出正確的行為,那麼就稱這個類是執行緒安全的。執行緒安全性的根源在於多執行緒對共享變數的併發訪問出現的 有三種方式可以修復這個問題 將狀態變數修改為不可變的變數 final...
c 多執行緒thread操作(二)執行緒管理
c 多執行緒thread操作 一 環境部署 c 多執行緒thread操作 二 執行緒管理 c 多執行緒thread操作 三 資料競爭互斥訪問 c 多執行緒thread操作 四 死鎖的問題和解決 c 多執行緒thread操作 五 unique lock加鎖 c 多執行緒thread操作 六 條件變數的...
併發 二 執行緒安全問題
一 執行緒安全 如圖示執行緒的工作記憶體與主記憶體的區別。加了violate關鍵字以後,就能保證執行緒記憶體中的變數及時回寫。但是這種情況一般適用於低併發,並且記憶體操作不涉及底層機器指令操作的情況下。對於如下所示的 public class thread lite public static vo...