在 Windows 系統編程中,線程調度與上下文管理是構建高性能、可控應用的基石。本文系統梳理 CONTEXT 結構、線程優先級體系、動態優先級提升機制與 處理器親和性 四大核心知識點,並給出關鍵 API 使用範例,助你從原理到實戰全面掌握。
// 獲取線程上下文(需先掛起線程)
BOOL GetThreadContext(HANDLE hThread, PCONTEXT lpContext);
// 設置線程上下文
BOOL SetThreadContext(HANDLE hThread, CONST CONTEXT* lpContext);
| 標誌 | 含義 |
|---|---|
| CONTEXT_CONTROL | 控制寄存器(EIP/RIP, ESP/RSP, EFLAGS/RFLAGS 等) |
| CONTEXT_INTEGER | 整數通用寄存器(EAX/RAX, EBX/RBX…) |
| CONTEXT_FLOATING_POINT | 浮點/SSE/AVX 寄存器 |
| CONTEXT_DEBUG_REGISTERS | 調試寄存器(DR0-DR7) |
| CONTEXT_ALL | 以上全部(等價於 CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) |
SuspendThread 掛起目標線程,否則寄存器狀態可能不一致。SetThreadContext 可用於實現線程劫持、異常處理、JIT 編譯器等高階場景。線程基本優先級 = 進程優先級類 + 線程相對優先級
| 類別 | 常數 | 典型基值 |
|---|---|---|
| Idle | IDLE_PRIORITY_CLASS | 4 |
| Below Normal | BELOW_NORMAL_PRIORITY_CLASS | 6 |
| Normal | NORMAL_PRIORITY_CLASS | 8 |
| Above Normal | ABOVE_NORMAL_PRIORITY_CLASS | 10 |
| High | HIGH_PRIORITY_CLASS | 13 |
| Real-time | REALTIME_PRIORITY_CLASS | 24 |
| 級別 | 常數 | 偏移量 |
|---|---|---|
| Idle | THREAD_PRIORITY_IDLE | -15 |
| Lowest | THREAD_PRIORITY_LOWEST | -2 |
| Below Normal | THREAD_PRIORITY_BELOW_NORMAL | -1 |
| Normal | THREAD_PRIORITY_NORMAL | 0 |
| Above Normal | THREAD_PRIORITY_ABOVE_NORMAL | +1 |
| Highest | THREAD_PRIORITY_HIGHEST | +2 |
| Time-Critical | THREAD_PRIORITY_TIME_CRITICAL | +15 |
// 進程級
BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);
DWORD GetPriorityClass(HANDLE hProcess);
// 線程級
BOOL SetThreadPriority(HANDLE hThread, int nPriority);
int GetThreadPriority(HANDLE hThread); // 返回相對優先級
Windows 為了響應性,會臨時提升某些線程優先級:
// 進程級禁止
BOOL SetProcessPriorityBoost(HANDLE hProcess, BOOL bDisablePriorityBoost);
// 線程級禁止
BOOL SetThreadPriorityBoost(HANDLE hThread, BOOL bDisablePriorityBoost);
注意:當前優先級永不低於進程基本優先級;僅對動態範圍(1~15)內的線程生效。
// 進程親和性掩碼(位掩碼,bit i = 1 表示允許在第 i 個邏輯處理器運行)
BOOL SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
BOOL GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask);
// 線程親和性掩碼
DWORD_PTR SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
// 理想處理器(提示調度器,非強制)
DWORD SetThreadIdealProcessor(HANDLE hThread, DWORD dwIdealProcessor);
掌握線程上下文操作、優先級組合公式、動態提升規則與親和性控制,是編寫高性能、可診斷、可控 Windows 應用的關鍵。建議在除錯器中觀察 CONTEXT 結構、使用 Process Explorer 觀察實時優先級變化,深化理解。