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兩種)
其中事件,訊號量,互斥器,這些核心物件可以用來整合許多的執行緒或程序。
注意:critical sections(臨界區域、關鍵區域)並不是核心物件。
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()獲知失敗原因。
Win32多執行緒之核心物件
createthread 傳回兩個值,用以識別乙個新的執行緒。第乙個值是個handle,這也是createthread 的返回值,大部分與執行緒有關的api函式都需要它。第二個值是由lpthreadid帶回來的執行緒id。執行緒id是乙個全域性變數,可以獨一無二地表示系統中任一程序中的某個執行緒。a...
Win32多執行緒之核心物件
createthread 傳回兩個值,用以識別乙個新的執行緒。第乙個值是個handle,這也是createthread 的返回值,大部分與執行緒有關的api函式都需要它。第二個值是由lpthreadid帶回來的執行緒id。執行緒id是乙個全域性變數,可以獨一無二地表示系統中任一程序中的某個執行緒。a...
Win32多執行緒之概述
win32多執行緒之概述 多執行緒在剛開始工作時也沒怎麼用,只是有時介面卡住了 一拖動程式主介面介面就會出現白色區域,久久不能消失,慢慢的明白主介面使用主線程,在單一執行緒通道中,乙個任務沒有完成,當前的所有工 作都將被鎖定,拖動介面會產生wm paint訊息,由於主線程被鎖定那麼這個訊息將不被程式...