1.多執行緒的原理
同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作(執行);多執行緒併發(同時)執行,其實是cpu快速地在多條執行緒之間排程(切換)。如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。
思考:如果執行緒非常非常多,會發生什麼情況?
cpu會在n多執行緒之間排程,cpu會類似,消耗大量的cpu資源;每條執行緒被排程執行的頻次會較低(執行緒的執行效率減低)。
2.多執行緒的優缺點
優點:能適當提高程式的執行效率;多執行緒**可以最大化利用計算機效能資源,提高資源利用率(cpu、記憶體利用率)。
缺點:開啟執行緒需要占用一定的記憶體空間(預設情況下,主線程占用1m,子執行緒占用512kb),如果開啟大量的執行緒,會占用大量的記憶體空間,降低程式的效能;執行緒越多,cpu在排程執行緒上的開銷就越大;程式設計更加複雜,例如執行緒之間的通訊、多執行緒的資料共享。
首先從簡單的問題入手,如何寫乙個多執行緒的c++**?
#include
#include
void fun(int a)
int main()
void helloworld::firstthread()
void helloworld::secondthread(int first,int second)
#include
#include
class a
void fun(int num)
bstop = false;
return;
(2) 在另外乙個執行緒中,要終止上面的執行緒迴圈:
bstop = true;
while( bstop ); //等待上面的執行緒終止,如果bstop不使用volatile申明,那麼這個迴圈將是乙個死迴圈,因為bstop已經讀取到了暫存器中,暫存器中bstop的值永遠不會變成false,加上volatile,程式在執行時,每次均從記憶體中讀出bstop的值,就不會死迴圈了。
這個關鍵字是用來設定某個物件的儲存位置在記憶體中,而不是暫存器中。因為一般的物件編譯器可能會將其的拷貝放在暫存器中用以加快指令的執行速度
volatile 關鍵字發揮了它的作用。其實不只是「內嵌彙編操縱棧」這種方式屬於編譯無法識別的變數改變,另外更多的可能是多執行緒併發訪問共享變數時,乙個執行緒改變了變數的值,怎樣讓改變後的值對其它執行緒 visible。一般說來,volatile用在如下的幾個地方:
1) 中斷服務程式中修改的供其它程式檢測的變數需要加volatile;
2) 多工環境下各任務間共享的標誌應該加volatile;
3) 儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義;
c++11中stl 提供了(目前)五個標頭檔案以支援多執行緒:
(提供原子操作功能)
(執行緒模型封裝)
(互斥量)
(條件變數)
如果需要將引數按引用傳遞,那要向下例所示那樣,必須將引數用std::ref 或者std::ref進行封裝。
#include
#include
void function(int& a, const std::string& str)
int main()
輸出結果為 519
該做法涉及到記憶體共享 往往效率不高
//將乙個執行緒移動成另乙個執行緒
std::thread p2=std::move(p1);
//錯誤做法
//std::thread p3=p1;
過move 可以減少不必要的記憶體分配
在上例**p2 = move(p1)後 p1 p2都是執行緒的物件
檢視程序id以及檢視系統硬體支援執行緒數
cout<< std::thread::hardware_concurrency() 新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要... 2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多... 多執行緒程式設計基本概念 併發 並行 執行緒 程序 同步 互斥 併發 巨集觀上線程同時執行,微觀上線程交替執行,也即基本單位為乙個時間段 並行 同一時刻,多個執行緒同時執行,也即以時間點為基本單位 c 11標準庫中提供了多執行緒庫,使用 include來引用 include includeusing...C 11 多執行緒
C 11 多執行緒
C 11 多執行緒