C 11 多執行緒

2021-06-22 07:47:56 字數 2244 閱讀 5528

新特性之描述:

雖然 c++11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c++11 標準庫的方式呈現。

c++11 標準庫會提供型別 thread (std::thread)。若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要的引數。通過成員函式 std::thread::join() 對執行緒會合的支援,乙個執行緒可以暫停直到其它執行緒執行完畢。若有底層平台支援,成員函式 std::thread::native_handle() 將可提供對原生執行緒物件執行平台特定的操作。

對於執行緒間的同步,標準庫將會提供適當的互斥鎖 (像是 std::mutex,std::recursive_mutex 等等) 和條件引數 (std::condition_variable 和 std::condition_variable_any)。前述同步機制將會以 raii 鎖 (std::lock_guard 和 std::unique_lock) 和鎖相關演算法的方式呈現,以方便程式設計師使用。

對於要求高效能,或是極底層的工作,有時或甚至是必須的,我們希望執行緒間的通訊能避免互斥鎖使用上的開銷。以原子操作來訪問記憶體可以達成此目的。針對不同情況,我們可以通過顯性的記憶體屏障改變該訪問記憶體動作的可見性。

對於執行緒間非同步的傳輸,c++11 標準庫加入了 以及 std::packaged_task 用來包裝乙個會傳回非同步結果的函式呼叫。 因為缺少結合數個 future 的功能,和無法判定一組promise 集合中的某乙個 promise 是否完成,futures 此一提案因此而受到了批評。

更高階的執行緒支援,如執行緒池,已經決定留待在未來的 technical report 加入此類支援。更高階的執行緒支援不會是 c++11 的一部份,但設想是其最終實現將建立在目前已有的執行緒支援之上。

std::async 提供了乙個簡便方法以用來執行執行緒,並將執行緒繫結在 std::future。使用者可以選擇乙個工作是要多個執行緒上非同步的執行,或是在乙個執行緒上執行並等待其所需要的資料。預設的情況,實現可以根據底層硬體選擇前面兩個選項的其中之一。另外在較簡單的使用情形下,實現也可以利用執行緒池提供支援。

具體細節:

c++標準執行緒庫簡潔且強大,跨平台顯得毫無壓力可言。這麼好用的東西,為什麼不趕快試試呢?

要使用標準執行緒庫需要包括標頭檔案

#include

#include

#include

這三個標頭檔案涵蓋了新標準的大部分內容,完全可以滿足專案的需求,c++執行緒庫源自boost,大部分內容都非常接近。

//非常簡單不是麼?

void run()

int _tmain(int argc, _tchar* argv)

極具魅力與**的存在,封裝的實在是太好了,使用起來非常的簡潔方便。

多執行緒不可避免的需要談到互斥鎖,c++新標準自帶了4種互斥鎖,實現方法大同小異,下面趕快來看看。

std::mutex iomutex;

std::recursive_mutex;

std::timed_mutex tmutex;

std::recursive_timed_mutex;

具體實現:

std::mutex iomutex;

void run()

int _tmain(int argc, _tchar* argv)

再來說下遞迴鎖std::recursive_mutex,遞迴鎖的用途只是因為在臨界區內部的函式中也有鎖的操作,因為專案模組分工,你不知道你的隊友是不是也使用相同的互斥鎖,如果這種情況發生的話,悲劇當然就是死鎖啦!不過引入遞迴鎖,這個問題就引刃而解了,不過麻煩的是鎖與解鎖需要匹配,這個是一定要注意的。

超時鎖std::timed_mutex tmutex的用途是為了搶占,因為當乙個執行緒進行臨界區操作的時候,你不知道它在做什麼?如果時間花費非常長呢?超時鎖可以在指定時間內搶占資源。

std::chrono::durationa(5);

tmutex.try_lock_for(a);

//超時時間設為5秒

// 臨界區

tmutex.unlock();

最後說一下條件變數condition_variable,作用是為了執行緒之間的通訊操作,比如a執行緒需要等待b執行緒完成某項操作才會繼續執行,這時候a執行緒需要等待b執行緒的通知。

這時候使用條件變數來處理,是最不好不過的了。

std::mutex cmutex;

std::condition_variable con_var;

void run1()

void run2()

}

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...

C 11 多執行緒

多執行緒程式設計基本概念 併發 並行 執行緒 程序 同步 互斥 併發 巨集觀上線程同時執行,微觀上線程交替執行,也即基本單位為乙個時間段 並行 同一時刻,多個執行緒同時執行,也即以時間點為基本單位 c 11標準庫中提供了多執行緒庫,使用 include來引用 include includeusing...