首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows API 進程與執行緒核心函式完整參考指南

     編輯:關於C++

概述

進程與執行緒是 Windows 執行體的基本單位。API 涵蓋建立/終止、同步物件 (事件、互斥體、訊號、可等待計時器)、進程間通訊 (管道、郵槽、命名管道)、動態連結庫載入、優先權控制、資訊查詢等完整生命週期管理。本文依功能分類整理核心函式,並說明關鍵參數與常見陷阱。

分類彙總表

1. 進程建立與終止

函式用途關鍵參數/備註
CreateProcess / CreateProcessAsUser / CreateProcessWithLogonW建立新進程 (完整/偽裝/指定認證)lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags (CREATE_SUSPENDED, DETACHED_PROCESS, CREATE_NEW_CONSOLE...), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation
ExitProcess / TerminateProcess正常結束/強制終止進程TerminateProcess 不執行 DLL_PROCESS_DETACH,慎用
GetExitCodeProcess取得結束代碼 (STILL_ACTIVE=259 表仍在執行)
WinExec / ShellExecute / ShellExecuteEx簡易執行/文件關聯啟動/進階啟動ShellExecuteEx 支援動詞 (open/edit/print/runas)、等待、視窗狀態
LoadModule16-bit 相容載入 (已淘汰)勿用於新開發

2. 執行緒建立與管理

函式用途
CreateThread / CreateRemoteThread建立本地/遠端執行緒
ExitThread / TerminateThread正常結束/強制終止 (強制終止會洩漏資源、破壞關鍵區)
GetExitCodeThread取得執行緒結束代碼
GetCurrentThread / GetCurrentThreadId取得偽控制代碼/真實 ID
GetThreadPriority / SetThreadPriority優先權級別 (THREAD_PRIORITY_IDLE ~ TIME_CRITICAL)
GetThreadTimes / GetProcessTimes核心/使用者/建立/結束 時間 (FILETIME)
SuspendThread / ResumeThread暫停/恢復計數器 (巢狀)
SwitchToThread自願讓出時間片
GetThreadContext / SetThreadContext / Wow64Get/SetThreadContext完整 CPU 內容存取 (除錯器/效能分析)

3. 同步物件

類型建立等待/通知適用場景
事件CreateEvent / CreateEventExSetEvent / PulseEvent / ResetEvent / WaitForSingleObject單次/持續訊號通知、手動/自動重置
互斥體CreateMutex / CreateMutexExWaitForSingleObject / ReleaseMutex跨進程互斥、擁有權遞歸、放棄檢測 (WAIT_ABANDONED)
訊號CreateSemaphore / CreateSemaphoreExWaitForSingleObject / ReleaseSemaphore資源計數控制 (連線池、緩衝區槽位)
可等待計時器CreateWaitableTimer / CreateWaitableTimerExSetWaitableTimer / CancelWaitableTimer高精度週期/單次觸發、喚醒系統、APC 完成例程
關鍵區InitializeCriticalSection / InitializeCriticalSectionExEnterCriticalSection / TryEnterCriticalSection / LeaveCriticalSection進程內高效互斥、自旋計數、遞歸
SRW LockInitializeSRWLockAcquire/Release SRWLock Exclusive/SharedVista+ 讀寫鎖、無擁有權、極輕量
條件變數InitializeConditionVariableSleepConditionVariableCS/SRW / WakeConditionVariable/Single/AllVista+ 高效等待/通知模式

4. 等待函式

函式用途備註
WaitForSingleObject / WaitForSingleObjectEx等待單一物件 (含 Alertable)Ex 版支援 APC 完成例程
WaitForMultipleObjects / WaitForMultipleObjectsEx等待多個物件 (ALL/ANY)最多 64 個控制代碼
MsgWaitForMultipleObjects / MsgWaitForMultipleObjectsEx等待物件 + 訊息佇列 (GUI 執行緒必備)避免 UI 凍結,支援輸入/事件/計時器訊息
WaitOnAddress / WakeByAddressSingle/AllWin8+ 位址等待/喚醒 (用戶模式輕量同步)無核心物件開銷,適合高爭用計數器

5. 進程間通訊 (IPC)

機制核心函式特性
匿名管道CreatePipe父子進程單向、生命週期綁定父進程
命名管道CreateNamedPipe / ConnectNamedPipe / DisconnectNamedPipe / CallNamedPipe雙向、跨網路 (SMB)、模擬用戶端身分、訊息/位元組模式
郵槽CreateMailslot / ReadFile / WriteFile單向廣播、不可靠、支援網路廣播
檔案映射 (共享記憶體)CreateFileMapping / MapViewOfFile / UnmapViewOfFile高速大量資料共享、支援大型檔案、安全描述元控制

6. 動態連結庫 (DLL) 管理

函式用途
LoadLibrary / LoadLibraryEx載入 DLL (Ex 旗標: LOAD_WITH_ALTERED_SEARCH_PATH, LOAD_LIBRARY_AS_DATAFILE...)
GetProcAddress取得匯出函式位址
FreeLibrary / FreeLibraryAndExitThread釋放 DLL (引用計數歸零時真正卸載)
GetModuleHandle / GetModuleHandleEx取得已載入模組基址
DisableThreadLibraryCalls停用 DLL_THREAD_ATTACH/DETACH 通知 (效能優化)

7. 優先權與資源配額

函式用途
GetPriorityClass / SetPriorityClass進程優先權類別 (IDLE, BELOW_NORMAL, NORMAL, ABOVE_NORMAL, HIGH, REALTIME)
GetProcessWorkingSetSize / SetProcessWorkingSetSize工作集大小 (實體記憶體配額)
GetProcessShutdownParameters / SetProcessShutdownParameters關機順序優先權
SetProcessAffinityMask / GetProcessAffinityMask處理器親和性 (指定可執行核心)

8. 進程/執行緒資訊查詢

函式用途
GetCurrentProcess / GetCurrentProcessId偽控制代碼 / 真實 ID
GetWindowThreadProcessId視窗所屬執行緒/進程 ID
OpenProcess / OpenThread依 ID 取得具權限控制代碼
EnumProcesses / EnumProcessModules / EnumProcessModulesExPSAPI/Toolhelp32 列舉系統進程/模組
GetProcessImageFileName / GetModuleFileNameEx進程/模組完整路徑 (需 PROCESS_QUERY_LIMITED_INFORMATION)

常見陷阱與最佳實務

  • CreateProcess 命令列引號規則:lpApplicationName 為 NULL 時,lpCommandLine 第一個 token 為模組名,含空格需雙引號包裹;引號嵌套需轉義。
  • TerminateProcess/Thread 禁忌:會導致關鍵區未釋放、堆積損毀、DLL 未正確卸載。正確做法:設定事件/旗標通知執行緒自行結束,或對進程發送 WM_CLOSE/CTRL_C_EVENT。
  • 同步物件命名衝突:跨進程命名物件 (Global\Local\ 命名空間) 需考慮 Session 隔離 (Terminal Services/RDP)。
  • DLL 載入順序劫持:LoadLibraryEx 指定 LOAD_WITH_ALTERED_SEARCH_PATH 或使用完整路徑,啟用 SetDefaultDllDirectories (Win8+) 限制搜尋目錄。
  • 64-bit 相容:GetWindowThreadProcessId 回傳 DWORD 執行緒 ID,進程 ID 亦為 DWORD;指標大小相關結構使用 ULONG_PTR。

現代替代方案

  • C++17/20 標準庫:std::thread, std::mutex, std::condition_variable, std::counting_semaphore, std::jthread (RAII 自動 join)。
  • Concurrency Runtime (PPL):concurrency::task, parallel_for, agent 等高階平行模式。
  • WinRT / Windows App SDK:Windows::System::DispatcherQueue, ThreadPool 等現代非同步模型。
  • 工程實務:核心邏輯用標準庫/PPL,僅在互操作系統 API (命名管道、全域互斥體、註冊表通知) 時呼叫原生函式。

結語

進程與執行緒 API 是 Windows 系統程式設計的基石。掌握建立/終止流程、同步物件選型 (關鍵區 vs 互斥體 vs SRW Lock vs 條件變數)、等待模式 (Alertable vs MsgWait)、IPC 機制特性、DLL 載入安全性,並遵循現代 C++ RAII 與標準庫優先原則,即可構建高效、穩健、可維護的並發應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved