Win32多執行緒之核心物件

2021-06-19 05:39:16 字數 1949 閱讀 6443

createthread()傳回兩個值,用以識別乙個新的執行緒。第乙個值是個handle,  這也是createthread()的返回值,大部分與執行緒有關的api函式都需要它。第二個值是由lpthreadid帶回來的執行緒id。執行緒id是乙個全域性變數,可以獨一無二地表示系統中任一程序中的某個執行緒。attachthreadinput()和postthreadmessage()就需要用到執行緒id,這兩個函式允許你影響其他人(執行緒)的訊息佇列。偵錯程式和程序觀察器也需要  執行緒id,為了安全防護的緣故,你不可能根據執行緒的id而獲得其handle。

createthread()傳回來的handle被稱為乙個核心物件(kernal object)。核心物件其實和所謂的gdi物件,如畫筆,畫刷或dc是差不多的,只不過它由kernel.dll來管理,而畫筆,畫刷由gdi32.dll來管理。兩種物件之間有許多相似性。

gdi物件是windows的基礎部分。在win16或win32中它們都是由作業系統管理。通常你不需要知道其資料格式。例如,你可能會呼叫selectobject()或releaseobject()以處理gdi物件:windows隱藏了實現細節,只是給你乙個hdc或者乙個hbrush,那都是物件的handle。

核心物件以handle為使用時的參考依據,與gdi的hbrush,hpen,hpalette以及其他handles不同的是,只有一種handle可以代表核心物件。所謂handle,其實是個指標,指向作業系統記憶體空間的某樣東西,那東西不允許你直接取得。你的程式不能夠直接取用它,為的是維護系統的完整性與安全性。

下面是各種win32核心物件的清單。

1)程序(processes)

2)執行緒(threads)

3)檔案(files)

4)事件(events)

5)訊號量(semaphores)

6)互斥器(mutexes)

7)管道(pipes,分為named和anonymous兩種)

其中事件,訊號量,互斥器,這些核心物件可以用來整合許多的執行緒或程序。

gdi物件和核心物件之間有乙個主要的不同,gdi物件有單一擁有者,不是程序就是執行緒。核心物件可以有乙個以上的擁有者,甚至可以跨程序。為了保持對每一位擁有者的追蹤,核心物件保持了乙個引用計數器,以記錄有多少handles對應次物件,物件中也記錄了那乙個程序或執行緒是擁有者。如果你呼叫createthread()或是其它會傳回handle的函式,引用計數便累加1.當你呼叫closehandle()時,引用計數便遞減1.一旦引用計數降至0,這一核心物件即自動被摧毀。

面對乙個開啟的物件,區分其擁有者是程序或者是執行緒。是件很重要的事情。因為這回=會決定系統何時做清除善後(clean up)操作。所謂

clean up操作,包括將該程序或執行緒所擁有的每乙個物件的引用計數減1,若有必要,則物件會被摧毀掉。程式設計師不能選擇由程序或者執行緒擁有物件,一切得視物件型別而定。

由於引用計數的設計,物件有可能在產生該物件之程序結束之後還繼續倖存。win32提供各種機制,讓其他程序得以取得乙個核心物件的handle。如果某個程序握有某個核心物件的handle,而該物件的原創者(程序)已經「作古」了,次核心物件並不會被摧毀。

closehandle()的重要性

當你完成你的工作後,應該呼叫closehandle釋放核心物件。

bool  closehandle(handle hobject);

引數hobject          代表乙個已開啟之物件handle

返回值如果成功,closehandle()返回true,如果失敗則傳回false.此時你可以呼叫getlasterror()獲知失敗原因。

所以它不可能知道解構順序是否重要。

如果乙個程序常常產生「worker 執行緒」而老是不關閉執行緒的handle,那麼這個程序可能最終有數百甚至數千個開啟的「執行緒核心物件」留給作業系統去清理,這樣的資源洩漏可能會對效率帶來負面的影響。

你不可以依賴「因執行緒的結束而清理所有被這一線程產生的核心物件」。虛度物件,例如檔案,是被程序所擁有,而非被執行緒擁有。在程序結束之前不能夠清理它們。

Win32多執行緒之核心物件

createthread 傳回兩個值,用以識別乙個新的執行緒。第乙個值是個handle,這也是createthread 的返回值,大部分與執行緒有關的api函式都需要它。第二個值是由lpthreadid帶回來的執行緒id。執行緒id是乙個全域性變數,可以獨一無二地表示系統中任一程序中的某個執行緒。a...

Win32多執行緒之核心物件

createthread 傳回兩個值,用以識別乙個新的執行緒。第乙個值是個handle,這也是createthread 的返回值,大部分與執行緒有關的api函式都需要它。第二個值是由lpthreadid帶回來的執行緒id。執行緒id是乙個全域性變數,可以獨一無二地表示系統中任一程序中的某個執行緒。a...

Win32多執行緒之概述

win32多執行緒之概述 多執行緒在剛開始工作時也沒怎麼用,只是有時介面卡住了 一拖動程式主介面介面就會出現白色區域,久久不能消失,慢慢的明白主介面使用主線程,在單一執行緒通道中,乙個任務沒有完成,當前的所有工 作都將被鎖定,拖動介面會產生wm paint訊息,由於主線程被鎖定那麼這個訊息將不被程式...