執行緒 執行緒控制代碼 執行緒ID

2021-06-09 11:28:35 字數 2581 閱讀 4959

什麼是控制代碼:

控制代碼是一種指向指標的指標。我們知道,所謂指標是一種記憶體位址。應用程式啟動後,組成這個程式的各物件是住留在記憶體的。如果簡單地理解,似乎我們只要獲知這個記憶體的首位址,那麼就可以隨時用這個位址訪問物件。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,windows是乙個以虛擬記憶體為基礎的作業系統。在這種系統環境下,windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的位址變化了。如果位址總是如此變化,我們該到**去找該物件呢?

為了解決這個問題,windows作業系統為各應用程式騰出一些內儲存位址,用來專門登記各應用物件在記憶體中的位址變化,而這個位址(儲存單元的位置)本身是不變的。windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的位址告知這個控制代碼位址來儲存。這樣我們只需記住這個控制代碼位址就可以間接地知道物件具體在記憶體中的哪個位置。這個位址是在物件裝載(load)時由系統分配給的,當系統解除安裝時(unload)又釋放給系統。

控制代碼位址(穩定)→記載著物件在記憶體中的位址→物件在記憶體中的位址(不穩定)→實際物件

執行緒與執行緒控制代碼的關係:

控制代碼可以認為是系統對資源(如執行緒)的分配的乙個編號。關閉這個編號,對於不同的資源,效果不盡相同。對於執行緒來說,關閉這個編號並不意味著終止執行緒,只是之後很難再操縱這個執行緒。

執行緒控制代碼與執行緒id的區別:

createthread() api 用於建立執行緒。 api 返回同時執行緒控制代碼和執行緒識別符號 (id)。執行緒控制代碼有完全訪問權建立執行緒物件。 執行執行緒時執行緒 id 唯一標識執行緒在系統級別。

●id是在windows系統範圍內唯一標示thread的。 

●handle是用來操作thread的,可以有多個,每個handle可以有不同的操作許可權,在不同程序openthread得到的值不一樣。 

●執行緒的id是系統全域性的,其handle是程序區域性的.

●handle是os和client之間用來操作程序和執行緒乙個橋梁,os有一張維護handle的表單,裡面大概放置了 

handle的引用計數和有關的屬性,handle是os標識程序和執行緒的東西,但是使用者也可以用這個來標識程序和執行緒,對其操作;而id是os用來標識程序和執行緒的,並且是全域性唯一的, 

但使用者可以通過這個id獲得程序執行緒的handle,多次得到的handle並不一定是一樣的.handle是核心物件,而id好像不是,並沒有專門建立id的函式.

●id是createthread時作業系統自動生成的。

●執行緒的控制代碼和id是不同的。 

在windows系統中,執行緒的id是唯一對應的,也就是說,如果兩個執行緒返回相同的id,則他們必然是同一執行緒,反之一定是不同的執行緒。而執行緒的控制代碼並不是執行緒的唯一標識,執行緒的控制代碼只是用來訪問該執行緒的的乙個32位值,儘管相同的控制代碼一定標識同一執行緒,但同一執行緒可能擁有兩個開啟的控制代碼,因此,不能用控制代碼來區分兩個執行緒是否是同一執行緒。

執行緒終止執行時發生的操作

當執行緒終止執行時,會發生下列操作:

• 執行緒擁有的所有使用者物件均被釋放。在 windows 中,大多數物件是由包含建立這些物件的執行緒的程序擁有的。但是乙個執行緒擁有兩個使用者物件,即視窗和掛鉤。當執行緒終止執行時,系統會自動撤消任何視窗,並且解除安裝執行緒建立的或安裝的任何掛鉤。其他物件只有在擁有執行緒的程序終止執行時才被撤消。

• 執行緒的退出**從 still_active 改為傳遞給 exitthread 或 terminatethread 的**。

• 執行緒核心物件的狀態變為已通知。

• 如果執行緒是程序中最後乙個活動執行緒,系統也將程序視為已經終止執行。

• 執行緒核心物件的使用計數遞減 1。

當乙個執行緒終止執行時,在與它相關聯的執行緒核心物件的所有未結束的引用關閉之前,該核心物件不會自動被釋放。

一旦執行緒不再執行,系統中就沒有別的執行緒能夠處理該執行緒的控制代碼。然而別的執行緒可以呼叫 getexitcodethread 來檢查由 hthread 標識的執行緒是否已經終止執行。如果它已經終止執行,則確定它的退出**:

bool getexitcodethread(handle hthread, pdowrd pdwexitcode);

退出**的值在 pdwexitcode 指向的 dword 中返回。如果呼叫 getexitcodethread 時執行緒尚未終止執行,該函式就用 still_active 識別符號(定義為 0x103)填入 dword。如果該函式執行成功,便返回 true。

執行緒退出的時候核心物件就會被激發, waitforsingleobject()為堵塞函式,等待執行緒的核心物件被激發。所以終止執行緒並釋放控制代碼物件的順序是:terminatethread()-->waitforsingleobject()-->closehandle().

執行緒、執行緒控制代碼、執行緒id的生成和消失

hthread = createthread(null, 0, threadproc, null, 0, &dwid);

//至此,新執行緒,執行緒控制代碼,執行緒id產生

terminatethread(hthread, 0);

//至此,執行緒id,執行緒控制代碼都依然存在

waitforsingleobject(hthread, infinite);

//至此,執行緒本身和執行緒id消失

closehandle(hthread);

//至此,執行緒控制代碼消失

執行緒 執行緒控制代碼 執行緒ID

什麼是控制代碼 控制代碼是一種指向指標的指標。我們知道,所謂指標是一種記憶體位址。應用程式啟動後,組成這個程式的各物件是住留在記憶體的。如果簡單地理解,似乎我們只要獲知這個記憶體的首位址,那麼就可以隨時用這個位址訪問物件。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,windows是乙個以...

執行緒控制代碼和執行緒ID的區別

createthread api 用於建立執行緒。api 返回同時執行緒控制代碼,並通過引數得到執行緒識別符號 id 執行緒控制代碼有完全訪問權建立執行緒物件。執行執行緒時執行緒 id 唯一標識執行緒在系統級別。id是在windows系統範圍內唯一標示thread的。handle是用來操作threa...

執行緒ID與執行緒ID

1 nptl標準 1.目前的執行緒實現是 native posix thread library,簡稱nptl 2.執行緒又被稱為輕量級程序。3.每乙個使用者態的執行緒,在核心之中都對應乙個排程實體也擁有自己的程序描述符 task struct結構體 4.程序內的所有執行緒呼叫 getpid 函式時...