多執行緒(c 11) 建立執行緒

2021-06-21 06:27:46 字數 1581 閱讀 6314

c++11 中建立執行緒非常簡單:

#include #include using namespace  std;

void thread_func()

void thread_func2(int i)

int main(int argc, _tchar* argv)

; thread t2;

return 0;

}

首先包含標頭檔案,這是c++11中新新增的類。然後用函式名和引數來構造乙個thread物件就可以了。構造完成後執行緒會自動執行。下面是建構函式的引數形勢:

templateexplicit thread(_fn&& _fx, _args&&... _ax)
第乙個引數是乙個函式,後面是乙個可變長參數列。

除了建立執行緒,一般還會有幾個相配套的控制線程的系統函式。

1、join函式

2、detach函式

在vs2013中編譯執行上面的測試**,發現會發生執行時錯誤!為什麼呢?

因為在多執行緒情況下,無論子執行緒執行完畢與否,一旦主線程執行完畢退出,所有子執行緒執行都會終止。這時整個程序結束或僵死(部分執行緒保持一種終止執行但還未銷毀的狀態,而程序必須在其所有執行緒銷毀後銷毀,這時程序處於僵死狀態),在第乙個例子的輸出中,可以看到子執行緒還來不及執行完畢,主線程的main()函式就已經執行完畢,從而所有子執行緒終止。需要強調的是,執行緒函式執行完畢退出,或以其他非常方式終止,執行緒進入終止態,但千萬要記住的是,進入終止態後,為執行緒分配的系統資源並不一定已經釋放,而且可能在系統重啟之前,一直都不能釋放。終止態的執行緒,仍舊作為乙個執行緒實體存在與作業系統中。(這點在win和unix中是一致的。)而什麼時候銷毀執行緒,取決於執行緒屬性。

通常,這種終止方式並非我們所期望的結果,而且乙個潛在的問題是未執行完就終止的子執行緒,除了作為執行緒實體占用系統資源之外,其執行緒函式所擁有的資源(申請的動態記憶體,開啟的檔案,開啟的網路埠等)也不一定能釋放。所以,針對這個問題,主線程和子執行緒之間通常定義兩種關係:

1、可會合(joinable)。這種關係下,主線程需要明確執行等待操作。在子執行緒結束後,主線程的等待操作執行完畢,子執行緒和主線程會合。這時主線程繼續執行等待操作之後的下一步操作。主線程必須會合可會合的子執行緒,thread類中,這個操作通過在主線程的執行緒函式內部呼叫子執行緒物件的jion()函式實現。必須強調的是,即使子執行緒能夠在主線程之前執行完畢,進入終止態,也必需顯示執行會合操作,否則,系統永遠不會主動銷毀執行緒,分配給該執行緒的系統資源(執行緒id或控制代碼,執行緒管理相關的系統資源)也永遠不會釋放。

預設情況下,建立的執行緒都是可會合的。可會合的執行緒可以通過呼叫detach()方法變成相分離的執行緒。但反向則不行。

我們的主線程中既沒有呼叫jion函式來等待子執行緒結束,也沒用呼叫detach來將其交給作業系統管理。最終很可能導致程序僵死,資源無法釋放!c++11對這種情況視為不合法,出現這種情況,c++11就會呼叫terminate函式來終止我們的程序。而在vs中呼叫terminate函式就會出現執行時錯誤對話方塊!

所以,要記住:對於每乙個子執行緒,到麼就呼叫join,要麼就呼叫detach。否則存在安全隱患,視為不合法!

C 11 多執行緒程式設計 執行緒的建立

1 通過函式指標建立執行緒 includevoid counter int id,int numiterations 過載 操作符 void operator const int main 建構函式不含引數 std thread t2 counter 將導致編譯錯誤,c 會將std thread t...

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

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