C 11標準庫thread簡介

2021-10-19 08:56:29 字數 2222 閱讀 6802

1.建立執行緒物件

1)不代表任何執行執行緒的物件

thread()

noexcept

;

2)fn為可呼叫物件(函式、仿函式(過載()運算子的類),初始化為"class()")、lame表示式)。args為與之同步的一包引數列表

【備註】:類的成員函式作為可呼叫物件時,第一引數必須是該成員函式的位址,第二引數應為該類。 仿函式作為可呼叫物件時,第二引數必須是仿函式類名+()。

template

<

classfn,

class..

. args>

explicit

thread

(fn&& fn, args&&..

. args)

;

3)無線程thread的拷貝、賦值語義

thread

(const thread&)=

delete

;thread&

operator=(

const thread&)=

delete

;

4)執行緒thread的move語義,swap也理解為move語義

thread

(thread&& x)

noexcept

;thread&

operator

=(thread&& _other)

noexcept

;

2.等待執行緒完成函式

void

join()

;

3.分離執行緒函式

void

detach()

;

4.判斷當前執行緒是否是可執行執行緒(是否可以被join和detach)

bool

joinable()

;

【備註】:由thread的預設建構函式而造成的,該thread被move過(包括move構造和move賦值),該執行緒被join或者detach過,都不是可執行執行緒。

5.執行緒傳參args

【重點】:

1)初始化執行緒的函式的形參一般為傳值、傳常引用方式,傳引用必須要與呼叫處std::ref(t)對應。

2)初始化執行緒的函式的形參為傳值方式時,並為物件(除int、float、string等一般型別)時,則該類物件必須要有型別轉換構造,並且實參不能為該類物件,應為型別轉換構造的引數型別。

3)初始化執行緒的函式的形參為傳常引用方式時,主線程中進行拷貝構造、子執行緒中進行析構,資料安全,但是引用失效,效率降低。

4)若分離執行緒中的函式的實參為形參物件的型別轉換構造的引數型別,實參物件釋放和型別轉換構造呼叫順序無法保證。

5)若要做到真正的引用,初始化執行緒的函式的形參應為傳引用、常引用方式,並且呼叫處應用std::ref(t)。

6)還可使用move,實現move語義。

6.執行緒id

獲取方式一:mythread.get_id(); 獲取執行緒物件mythread的id

獲取方式二:std::this_thread::get_id(); 獲取當前執行緒id

7.硬體支援的併發執行緒數

可以用以控制同時段都有執行的執行緒和硬體執行緒數量(同一時刻執行的執行緒最大數量)的關係,防止超額訂閱,因為上下文切換會降低效能。

static

unsigned

inthardware_concurrency()

noexcept

;

8.nativehandle函式允許使用平台api直接操作低層實現

typedef

void

* native_handle_type;

native_handle_type native_handle()

更深入的**請參考對我另外一篇部落格:

關於c 11中的thread庫

c 11中新支援了thread這個庫,常見的建立執行緒 join detach都能支援。join是在main函式中等待執行緒執行完才繼續執行main函式,detach則是把該執行緒分離出來,不管這個執行緒執行得怎樣,往下繼續執行main函式。join操作會等待執行緒執行完畢,然後 該執行緒資源,de...

C 11 標準庫筆記1

stl standard template library,標準模板庫 初始化 int values 引入 range based for 迴圈 for decl coll forward list,單向鍊錶實現 2 關聯式容器 associative container 已排序的集合,大都有二叉樹...

C 標準庫 C 11新特性

c 定義了nullptr以取代0或者null。nullptr是std nullptr t型別的 constexpr 變數。std nullptr t可以顯式或隱式地轉換為任何指標 包括類的成員函式指標 但不能顯式或隱式地轉換為任何其他型別。range based for迴圈 類似於別的語言中的for...