std thread執行緒詳解(1)

2022-01-09 22:20:01 字數 2598 閱讀 8260

總結ref

本文主要介紹了標準庫中的執行緒部分。執行緒是目前多核程式設計裡面最重要的一部分。

與程序程序相比,其所需的資源更少,執行緒之間溝通的方法更多; 他們之間的區別可以比較簡明用以下幾點概括[1]:

程序是資源分配的最小單位,執行緒是cpu排程的最小單位;也就是說程序之間的資源是相互隔離,而執行緒之間的是可以相互訪問的。

執行緒的存在依賴於程序,乙個程序可以保護多個執行緒;

程序出現錯誤不會影響其他程序,但是乙個執行緒出現錯誤,會影響同一程序下的所有執行緒。

一般使用std::thread建立乙個執行緒。std::thread支援輸入乙個函式物件,及一些引數,類似於std::bind,不過沒有佔位符。

最常見,最簡單的是對輸入乙個匿名函式作為引數:

std::thread t1(() );

t1.join();

需要注意的是,在使用多執行緒的時候,如果使用類似於std::cout << "hello world" << std::endl;的語句,容易造成輸出的混亂。比如

std::thread t1(() );

std::thread t2(() );

t1.join();

t2.join();

以上**,我們一般來說期望的輸出是

但是,在一些情況下,它還會以以下的方法輸出

造成這個的原因很簡單,因為"hello world"std::endl的輸出是分開的,所以他們之間可能被插入其他的輸出。為了解決這個問題。一般會使用乙個完整的字串進行輸出,但是c++在格式化這一方面做的比較差(c++20format庫看起來還不錯),所以一般情況下會使用printf輸出。

joinable()判斷執行緒是否可連線(可執行執行緒)的,有以下情況的,為不可連線的:

構造時,thread()沒有引數;

該物件的執行緒已經被移動了;

該執行緒已經被joindetach

get_id()返回執行緒的id;

native_handle()返回posix標準的執行緒物件;

join()等待執行緒執行完成;

detach()分離執行緒,分離後物件不再擁有執行緒。該執行緒結束後,會自動**記憶體。(並不會開啟另乙個程序);

swap()交換物件的執行緒。

除了常用的std::thread外,標準庫還存在著另乙個可以建立執行緒的類,std::jthread。他們之間的差別比較明顯的就是,std::jthread會在解構的時候判斷執行緒是否還在執行joinable,如果還在執行則自動呼叫request_stopjoin

除此之外,std::jthread還提供了乙個內建的std::stop_token。可以通過執行緒函式的第乙個引數來獲取(如果函式的第乙個引數型別為std::stop_token)。

可以通過get_stop_sourceget_stop_tokenrequest_stop等方法來對其進行操作。

stop_token類似於乙個訊號,告訴執行緒是否到了結束的時候。和stop_source一起使用。stop_token用來獲取是否退出(讀),而stop_source用來請求推出(讀寫)。其方法:

request_stop請求退出

stop_requested獲取是否已經請求退出

stop_possible獲取是否可以請求退出

樣例:

void thread_func(std::stop_token token) 

printf("exit\n");

}int main()

輸出:

本次講述了執行緒建立的一些方法,可以看到相比較c語言而言,由於c++11提出的函式物件(普通函式、匿名函式,std::bind的輸出等)使得執行緒的建立更加的方便。

下一次將講述執行緒之間的通訊。在c++中,執行緒之間的通訊方法和c語言提供的類似,不過是將其包裝了一下。

[1]

部落格原文:

Qt 多執行緒之 std thread 一

不時見到有人會這樣做 那麼,如何使用pthread,而又使用qt提供的執行緒間機制呢?本文的初衷源於此,但是使用的的是c 0x 的 std thread,而不是直接使用unix的pthread。既然用qt,還是盡量保證誇平台吧 不想寫太多的文字,還是用乙個乙個的小例子來說話吧。int main in...

Cpp 七 std thread 標準庫多執行緒

c 14cmake 3.17 macos 10.15 5clion include include void func1 void func2 intmain 現象 先列印輸出func1兩秒後再列印輸出func2,再過兩秒後退出程式 include include void func1 void f...

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

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