多執行緒的建立問題

2021-07-07 03:42:51 字數 1890 閱讀 9748

已知程序是執行緒執行程式的容器,程序只是為執行緒的執行提供乙個執行環境。真正執行程式的是執行緒,每個程序至少擁有乙個執行緒,當建立乙個程序時,那麼系統會自動建立乙個執行緒,稱為主線程,也就是執行main函式或winmain函式的執行緒,該函式是程式的入口函式,此後,主線程建立其他執行緒。

對單執行緒來說,在程序的位址空間中只有乙個執行緒在執行。

對多執行緒來說,在程序位址空間中有多個執行緒在執行。

當程式移植到多cpu的平台上時,其中的多個執行緒就可以真正併發的同時執行了,可以大大提高執行效率。

c++本身並沒有提高多執行緒的機制,我們可以使用windows下的win32 sdk   createthread   api函式進行編寫多執行緒程式。

createthread函式 - 該函式將建立乙個執行緒。該函式的原型宣告如下:

handle createthread(  lpsecurity_attributes lpsa,  //指向安全屬性的指標,這裡可以為其傳遞null,讓該執行緒使用預設的安全屬性。
dword cbstack, //設定執行緒初始棧的大小,即執行緒可以將多少位址空間用於它自己的棧,以位元組為單位。如果該值為0,這預設將使用與呼叫該函式的執行緒相同的棧空間大小。

lpthread_start_routine lpstartaddr,//表明為新執行緒的起始位址。

lpvoid lpvthreadparam, //通過該引數給建立的新執行緒傳遞引數。該引數提供了乙個將初始化值傳遞給執行緒函式的手段,這個引數可以是乙個數值也可以是乙個指向其他資訊的指標。

dword fdwcreate,//用於控制線程建立的附加標記。它可以是兩個值中的乙個:create_suspended或0.如果為create_suspended則執行緒建立之後處於暫停狀態,直到程式呼叫了resumethread函式為止;如果為0則立刻執行。

lpdword lpidthread); //該引數是乙個返回值,它指向乙個變數,用於接收執行緒id。該引數可以為null。
lp

startaddr表示為新執行緒的起始位址,是乙個lpthread_start_routine型別的函式指標,這個函式由新執行緒執行,表明新執行緒的起始位址。我們知道main函式是主線程的入口函式,同樣,乙個新執行緒也需要乙個入口函式,那麼lpstartaddr就是該入口函式的指標。這就要求在程式中建立乙個函式作為新執行緒的入口函式,該函式的名稱可以是任意的,但函式必須遵守以下宣告形式。

dword threadproc(
lpvoid lpparameter);
該函式只有乙個lpvoid引數和乙個返回值dword型別。其中該引數用於接收傳遞引數。

以下是乙個簡單多執行緒示例:

#includeusing namespace std;

dword winapi fun1proc( lpvoid lpparameter);

int main(int argc, char* argv)

{ handle hthread;

hthread = createthread(null,0,fun1proc,null,0,null);

closehandle(hthread);

sleep(100);

cout<<"main thread is running!"<

在建立執行緒之後,呼叫closehandle函式關閉新執行緒的控制代碼並沒關閉新生成的執行緒,只是表示主線程對新建立的執行緒的控制代碼不感興趣,因此將其關閉,關閉該控制代碼視為了讓系統遞減該執行緒核心物件的使用計數,當使用計數為0時,系統會釋放該執行緒核心物件。如果沒有關閉執行緒控制代碼,系統就會一直這樣保持對執行緒核心物件的引用,浪費系統空間,但是在程序終止時,系統也會清理這些殘留的物件,將其關閉。

多執行緒的建立

每乙個程序都必須有乙個主線程,在主線程中我們可以建立多個執行緒。建立執行緒的方法有以下幾種 一 繼承thread類 這種方法需要重寫run方法,非常簡單,但同時會使 結構混亂而且降低可讀性。package p1 public class mythread extends thread 通過宣告建立的...

多執行緒的建立

includejoin 主要是指當建立子執行緒後,子執行緒執行,主線程要在某個地方等待子執行緒執行完畢。detach 建立子執行緒後,子執行緒與主線程分離稱為守護執行緒,它的資源之內的東西,由系統管理。使用detach 時,要避免使用主線程中的引用,指標之內的東西。否則當主線程釋放相應資源時,子執行...

建立多執行緒

多執行緒 乙個程式可以同時執行多個任務,每個任務由 乙個單獨的 執行緒完成,可提高程式執行速度和處理速度 執行緒為程式執行的基本單位 2.建立乙個執行緒類的物件。threaddemo1 td new threaddemo1 3.啟動執行緒執行 td.start 1.建立實現runable介面的雷,並...