C 多執行緒(一) 執行緒管理

2021-07-22 08:48:37 字數 2210 閱讀 4623

多執行緒是……/*此處省略一萬字,省略的文字詳細說明了什麼是多執行緒、其歷史及其發展、使用多執行緒的好處和缺點以及c/c++對多執行緒的支援的歷史*/

c++標準庫自c++11標準以來開始支援多執行緒,多執行緒相關的類在thread標頭檔案中,所以使用請先必須#include

啟動乙個執行緒非常簡單,例程如下:

#include #include void test1()

int main()

上面的**std::thread t(test1)建立並且啟動乙個執行緒,所啟動的執行緒將執行test1()函式中的**。

執行緒必須要有乙個可呼叫物件來初始化和啟動,這個可呼叫物件可以是函式物件、一般函式、lambda表示式或者成員函式或者由std::bind()產生的可呼叫物件。

下面是啟動執行緒的幾種不同方式的例程:

#include #include //一般函式

void test1()

void test2(int c)

class callable

void mem() };

int main()

); std::cout << "-------this message from main thread.-------" << std::endl;

t1.join();

t2.join();

t3.join();

t4.join();

t5.join();

std::cin.get();

return 0;

}

傳遞進執行緒中執行的函式也可以有引數,傳遞引數到執行緒中也不是什麼難題,**如下:

void f(int i,std::string const& s);

std::thread t(f,3,」hello」);

但需要注意的是,所有傳遞進執行緒的引數,執行緒首先將實參值複製到其當前執行緒空間中。然後使用的是執行緒空間中的變數。當你的**如下時,最後的結果可能不是你希望的。

void update_data_for_widget(widget_id w,widget_data& data);

void oops_again(widget_id w)

上述**首先將data複製到執行緒空間中,然後再將執行緒空間中data值的引用傳遞到update_data_for_widget()函式中,而不是oop_again函式中原data的引用。要想確保傳遞的是原data的引用,需要用到新的基礎設施:std::ref()。就像下面的**這樣:

std::thread t(update_data_for_widget,w,std::ref(data));
這樣,你的**就能正常工作了。

(1)c++中,執行緒不可被拷貝構造和賦值構造,唯一能夠使用的是移動構造,因此,想要用乙個執行緒去初始化別乙個執行緒,正確的語法如下:

void some_function();

void some_other_function();

std::thread t1(some_function);

std::thread t2=std::move(t1);

t1=std::thread(some_other_function);

std::thread t3;

t3=std::move(t2);

t1=std::move(t3);

(2)每乙個執行緒都有乙個唯一的標識,其型別為std::thread::id, 執行緒可以通過

std::this_thread::get_id() 函式來獲取其id。

(3)細心的讀者可以注意到了開始執行緒的**片段裡用到了執行緒的成員函式join(),這個函式用於等待執行緒的結束,否則**將阻塞在join()函式的呼叫處。這是因為每個程序都有乙個主線程,當主線程結束時,這個程序就會終止,系統最後會**這個程序的資源。當主線程結束時,其他執行緒就算沒有結束,也會被結束。為了使得其他執行緒執行結束後程序再終止,由於無法主動獲知其他執行緒會在何時結束,所以必須要主線程中等待其他執行緒的結束。其他的相關成員函式還有joinable()和detach(),當乙個執行緒detach時,將無法join(等待),而執行緒是是否可join,可以用joinable()函式來檢測。當執行緒呼叫detach()函式或者join()函式後,joinable()函式都將返回false。

C 多執行緒操作(一) 執行緒與執行緒池

c 中可以直接操作thread物件來操作執行緒 具體 實現如下 class program 這種方式執行緒會輪流執行,而不是執行完乙個再開始執行另外乙個 console.readkey public static void dowork endregion c 中為了解決執行緒頻繁建立帶來的效能開銷...

多執行緒技術 一 執行緒概述

程序 是應用程式的乙個執行例程,是應用程式的一次動態執行過程。執行緒 是程序中的乙個執行單元 是作業系統分配cpu時間的基本單元。windows是乙個支援多執行緒的系統。乙個程序可以包含若干個執行緒。多執行緒的概念 多執行緒 在同一時間執行多個任務的功能,稱為多執行緒或自由執行緒。多執行緒的優點 可...

多執行緒基礎(一)執行緒建立

繼承thread類 自定義乙個類,繼承thread類 重寫run方法,run方法中用於定義當前執行緒的執行邏輯。建立執行緒類的物件 開啟執行緒 thread類中start 方法啟動執行緒 此案例展示第一種建立執行緒之方法 繼承thread類 說明 1.若 static 修飾 i,則共享i 關於thr...