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

C++ 多線程技術 Windows 平台常用 API 詳解

     編輯:C++ 入門

線程狀態

  • 掛起:創建後未運行,或調用 `SuspendThread`。無執行資格。
  • 就緒/等待:有執行資格,等待 CPU 時間片。
  • 運行:獲得時間片,正在執行指令。
  • 阻塞:I/O、鎖等待、睡眠等,主動放棄 CPU。

狀態流轉:創建(掛起) → ResumeThread → 就緒 → 調度 → 運行 → 阻塞/時間片用盡 → 就緒 → ... → 退出。

核心 API

創建線程

HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全屬性,通常 NULL
    SIZE_T dwStackSize,                       // 棧大小,0=默認 1MB
    LPTHREAD_START_ROUTINE lpStartAddress,    // 線程函數入口
    LPVOID lpParameter,                       // 傳給線程函數的參數
    DWORD dwCreationFlags,                    // 0=立即運行, CREATE_SUSPENDED=掛起創建
    LPDWORD lpThreadId                        // 接收線程 ID,可 NULL
);

返回 `HANDLE`(線程句柄,本質是指針),用於後續操作。失敗返回 `NULL`。

線程控制

  • `DWORD ResumeThread(HANDLE hThread)`:喚醒掛起線程,返回前掛起計數。
  • `DWORD SuspendThread(HANDLE hThread)`:掛起線程,返回前掛起計數。慎用:可能導致死鎖(如掛起持有鎖的線程)。
  • `BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)`:強制終止,極度危險(不釋放鎖、不執行析構、破壞進程狀態)。已棄用,禁用。
  • `void ExitThread(DWORD dwExitCode)`:線程主動退出。

同步等待

  • `DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds)`:等待線程結束(`hHandle` 為線程句柄),`INFINITE` 永久等待。返回 `WAIT_OBJECT_0` 成功。
  • `DWORD WaitForMultipleObjects(DWORD nCount, const HANDLE* lpHandles, BOOL bWaitAll, DWORD dwMilliseconds)`:等待多個線程/事件。

線程局部存儲 (TLS)

DWORD TlsAlloc();           // 分配 TLS 索引
LPVOID TlsGetValue(DWORD dwTlsIndex);
BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue);
BOOL TlsFree(DWORD dwTlsIndex);

每線程獨立的 `void*` 值,無需鎖即可存取線程私有數據。

關鍵字 volatile

告訴編譯器「該變量可能被外部(其他線程、硬件、信號處理器)修改」,禁止優化掉讀寫、禁止重排序(僅限編譯器層面,不保證 CPU 內存序)。
用於簡單標誌位:`volatile bool stop = false;` 線程 1 寫 `stop=true`,線程 2 讀 `while(!stop)`。
不適用於複雜同步,需配合 `Interlocked*` 原子操作或 `CriticalSection`/`Mutex`/`Event`。

完整示例

#include 
#include 

volatile bool stop = false;
DWORD WINAPI Worker(LPVOID param) {
    int id = (int)(intptr_t)param;
    while (!stop) {
        printf("Thread %d working...\n", id);
        Sleep(1000);
    }
    printf("Thread %d stopped.\n", id);
    return 0;
}

int main() {
    HANDLE h[2];
    h[0] = CreateThread(NULL, 0, Worker, (LPVOID)1, 0, NULL);
    h[1] = CreateThread(NULL, 0, Worker, (LPVOID)2, 0, NULL);
    Sleep(3000);
    stop = true; // 通知停止
    WaitForMultipleObjects(2, h, TRUE, INFINITE); // 等待兩線程結束
    CloseHandle(h[0]); CloseHandle(h[1]);
    return 0;
}

現代 C++ 建議

  • C++11 起優先使用 `std::thread`、`std::mutex`、`std::condition_variable`、`std::atomic`,跨平台、RAII 安全、語義清晰。
  • Windows API 僅在需調用平台特有功能(如纖維、IOCP、特定同步原語)或維護舊代碼時使用。

總結

Windows 線程 API 核心:`CreateThread`/`ResumeThread`/`SuspendThread`/`WaitForSingleObject`/`TerminateThread(禁用)`/`ExitThread`。同步用 `CriticalSection`/`Mutex`/`Event`/`Semaphore`。`volatile` 僅防編譯器優化,非線程安全萬能藥。現代代碼首選 C++11 標準庫線程設施。

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