C++多執行緒之CreateThread
阿新 • • 發佈:2018-12-20
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。同時,能控制執行緒執行,掛起,喚醒和結束。至於優先順序之類的,貌似手動設定不如系統優化。
公有方法 明天更新 私有變數
完整原始碼(也可下載完整測試工程)