1. 程式人生 > >C++多執行緒之CreateThread

C++多執行緒之CreateThread

WIN32API,需要包含標頭檔案windows.h

API簡介

簡單瞭解下,平時用到的也就那兩三個。

介面 簡介
SwitchToThread 切換到另一個可排程執行緒
CreateThread 建立執行緒
CreateRemoteThread 建立遠端執行緒
GetCurrentThread 獲取執行緒控制代碼
GetCurrentThreadId 獲取執行緒ID
OpenThread 開啟一個現有執行緒物件
SetThreadPriority 設定執行緒優先順序
GetThreadPriority 獲取執行緒優先順序
SetThreadPriorityBoost 設定開關–系統動態提升該執行緒的優先順序
GetThreadPriorityBoost 獲取~開關
ExitThread 線上程的執行過程中終止
TerminateThread 線上程的外面終止
GetExitCodeThread 獲取一個已中止執行緒的退出程式碼
SuspendThread 暫停執行緒
ResumeThread 恢復執行緒
SetThreadStackGuarantee 要求系統在丟擲EXCEPTION_STACK_OVERFLOW異常的時候,保證仍然有指定大小的空閒區可以用
WaitForSingleObject 阻塞,直到等到訊號
CloseHandle 關閉控制代碼

CreateThread導致記憶體洩漏

根據百度來的,口水一下。C執行庫中有許多全域性變數,如錯誤碼等。多個執行緒同時操作這些全域性變數,就會出錯(沒同步)。所以,微軟就給每個執行緒劃分了自己存全域性變數的空間,TLS(thread local storage)。這樣,各用各的,就不會出錯了。奇怪的是,CreateThread壓根沒TLS的概念,就不會建立這個記憶體。當在CreateThread建立的執行緒中要讀寫那些全域性變數時,發現沒有TLS,就會建立一個給自己用。可恨的是,CloseHandle中不會釋放TLS。這樣,記憶體就洩漏了。 所以,為了保險起見,建立執行緒使用C執行庫中的_beginthread或_beginthreadex。

SuspendThread的計數規則

在測試中,對一個執行緒連續SuspendThread三次,然後ResumeThread一次,發現執行緒沒有被喚醒。直到再ResumeThread兩次後,執行緒才被喚醒。估計執行緒內有個計數,SuspendThread一次加一,ResumeThread一次減一。0表示執行緒可以執行啦,求CPU來擁抱。

自定義一個實用的執行緒類

一個理想的執行緒,當然是希望它自然退出,不能自然退出視為邏輯BUG。同時,能控制執行緒執行,掛起,喚醒和結束。至於優先順序之類的,貌似手動設定不如系統優化。

公有方法 明天更新 私有變數

完整原始碼(也可下載完整測試工程)