C C 多執行緒的學習心得總結

2022-10-04 05:06:10 字數 2547 閱讀 6320

個人覺得在學習多執行緒程式設計之前最好先了解程序和執行緒的關係, 然後在學習執行緒工作方式的過程中動手寫個(我是從抄開始的)多執行緒的小程式, 會對學習多執行緒有很大的幫助, 否則只有理論是很抽象的.

在學習多執行緒程式設計之前, 必須先知道什麼是 執行緒函式, 執行緒函式就是另乙個執行緒的入口函式. 預設情況下乙個我們所寫的**都是只有乙個執行緒的, 而這個執行緒的入口函式就是main() 函式, 這是系統預設的. 而我們建立的另乙個執行緒也需要乙個函式來進入, 這個函式就叫做執行緒函式.

在c/c++中, 可以呼叫 '執行期庫' 函式 _beginthreadex(...), 來建立乙個執行緒, _beginthreadex(...)函式接受6個引數, 其中第3個引數要求傳入該執行緒的入口函式的位址(即:傳入執行緒函式的函式名+&即可), 其它的每個引數的意思可以在msdn或網上查一下, 入門的話其餘引數全部傳0即可.

_www.cppcns.combeginthreadex(...)函式返回乙個控制代碼, 就是新執行緒的控制代碼. 對於傳入的執行緒函式是有要求的, 執行緒函式必須返回 unsignewww.cppcns.comd __stdcall 型別, 並且接受乙個 void* 型引數, 函式的內容就可以自己定了.

先來段多執行緒的簡單**:

複製** **如下:

#include

#include

#include

using namespace std;

bool stop;

unsigned counter;

unsigned __stdcall thread(void*)

//_endthreadex(0);

return 0;

}int main()

**是正確的, 複製貼上到 visual c++ 6.0 中, 即可編譯執行. 但是會發現 _beginthreadex(...) 函式未定義的編譯錯誤. 原因是因為我們的visual c++ 6.0 預設的是在單執行緒模式下程式設計, 如果需要進行多執行緒程式設計, 需要轉換一下編譯器的 '執行期庫' , 方法很簡單:

project --> settings --> c/c++ 中 選擇 category 中的 code generation , 然後在 use run-time library 裡面選含有multithread的其中乙個就可以了.

這時再編譯, 就可以通過了. 有了這個例子的函式, 現在應該已經入門了吧. 不過除了這個還有很多基礎知識要補上, 推薦通讀幾遍 的第6章.

實際上, 在不同的編譯環境下, _beginthreadex(...)函式可能會有不同的名稱, 但是它們都是對 windows函式 createthread(...) 的封裝, createthread(...)函式用來建立乙個新的執行緒函式, createthread(...)函式同樣接受6個引數, 在類似 _beginthreadex(...)的函式中對其做了一些安全的處理, 如堆疊記憶體的申請等www.cppcns.com. 雖然可以用createthread函式來建立乙個新的執行緒, 但是強烈建議使用 _beginthreadex(...)函式, 對於createthread 函式在第6章中有很好的講解.

當乙個執行緒的任務結束, 要退出時, 有四種方法:

1.執行緒函式返回(最好使用這種方法);

2.通過呼叫 _endthreadex()或 exitthread()函式,執行緒將自行撤消(最好不要使用這種方法);

3.同乙個程序或另乙個程序中的執行緒呼叫 terminatethread()函式(應該避免使用這種方法);

4.包含執行緒的程序終止執行(應該避免使用這種方法).

最好通過其入口函式的返回語句(即:return)來退出執行緒, 也可以通過呼叫 c/c++ '執行期庫'函式 _endthreadex()函式來退出, 還有兩種程式設計客棧退出的方法, 都是類似的強制退出. 最好使用執行緒函式的返回語句(return)來退出執行緒, 只有這樣才能安全的**該執行緒的處理器資源和記憶體資源. 而實際上 _qmnrqendthreadex()函式和 _beginthreadex(...)函式一樣, 是封裝了windows函式 exitthread(), 如果一定要強制退出執行緒, 那麼強烈建議呼叫 _endthreadex() 函式, 這樣能安全的**系統資源.

具體的 _beginthreadex(...)函式 和 _endthreadex()函式在第6章中有很好的剖析. 同時還有兩個 _beginthread(...) 和 _endthread() 執行期庫函式, 也有講解.

windows還提供了一些庫函式用來獲得當前程序或者執行緒的控制代碼, 如 handle getcurrentprocess() 函式返回當前程序的控制代碼, handle getcurrentthread() 函式返回當前執行緒的控制代碼, 但是需要注意的是, 這些控制代碼都是 '偽控制代碼' , 即: 只在本程序和本執行緒內可用, 不可傳出取用.

如果需要在外部使用其它執行緒或程序的控制代碼, 則可以用 duplicatehandle(...) 函式獲得其它程序或者執行緒的 '實控制代碼' , 該函式接受7個引數, 具體的用法可以查閱一下msdn和網路. 需要注意的是, 在使用完 由duplicatehandle(...) 函式獲得的控制代碼後, 需要使用 closehandle() 函式來關閉該控制代碼.

本文標題: c/c++ 多執行緒的學習心得總結

本文位址:

多執行緒學習心得

除非一台計算機有多個cpu 如雙核 否則是不會真正的執行兩個以上的程式的。但是如果是那樣我們為什麼可以同時執行多個程式呢?這就是多執行緒的作用了,乙個程序是由多個執行緒組成的,一台計算機可以同時執行多個不同程序的執行緒,而不是乙個完整的程序。多執行緒主要有兩個優勢 1.提高介面程式的響應速度 2.充...

多執行緒學習心得

除非一台計算機有多個cpu 如雙核 否則是不會真正的執行兩個以上的程式的。但是如果是那樣我們為什麼可以同時執行多個程式呢?這就是多執行緒的作用了,乙個程序是由多個執行緒組成的,一台計算機可以同時執行多個不同程序的執行緒,而不是乙個完整的程序。多執行緒主要有兩個優勢 1.提高介面程式的響應速度 2.充...

多執行緒的學習心得

1.synchronized的三種應用方式 1 修飾例項方法,作用於當前例項加鎖,進入同步 前要獲得當前例項的鎖 2 修飾靜態方法,作用於當前類物件加鎖,進入同步 前要獲得當前類物件的鎖 3 修飾 塊,指定加鎖物件,對給定物件加鎖,進入同步 庫前要獲得給定物件的鎖。synchronized修飾例項方...