總結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++20
的format
庫看起來還不錯),所以一般情況下會使用printf
輸出。
joinable()
判斷執行緒是否可連線(可執行執行緒)的,有以下情況的,為不可連線的:
構造時,thread()
沒有引數;
該物件的執行緒已經被移動了;
該執行緒已經被join
或detach
;
get_id()
返回執行緒的id;
native_handle()
返回posix
標準的執行緒物件;
join()
等待執行緒執行完成;
detach()
分離執行緒,分離後物件不再擁有執行緒。該執行緒結束後,會自動**記憶體。(並不會開啟另乙個程序);
swap()
交換物件的執行緒。
除了常用的std::thread
外,標準庫還存在著另乙個可以建立執行緒的類,std::jthread
。他們之間的差別比較明顯的就是,std::jthread
會在解構的時候判斷執行緒是否還在執行joinable
,如果還在執行則自動呼叫request_stop
和join
。
除此之外,std::jthread
還提供了乙個內建的std::stop_token
。可以通過執行緒函式的第乙個引數來獲取(如果函式的第乙個引數型別為std::stop_token
)。
可以通過get_stop_source
、get_stop_token
、request_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...