狀態流轉:創建(掛起) → ResumeThread → 就緒 → 調度 → 運行 → 阻塞/時間片用盡 → 就緒 → ... → 退出。
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 TlsAlloc(); // 分配 TLS 索引 LPVOID TlsGetValue(DWORD dwTlsIndex); BOOL TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); BOOL TlsFree(DWORD dwTlsIndex);
每線程獨立的 `void*` 值,無需鎖即可存取線程私有數據。
告訴編譯器「該變量可能被外部(其他線程、硬件、信號處理器)修改」,禁止優化掉讀寫、禁止重排序(僅限編譯器層面,不保證 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; }
Windows 線程 API 核心:`CreateThread`/`ResumeThread`/`SuspendThread`/`WaitForSingleObject`/`TerminateThread(禁用)`/`ExitThread`。同步用 `CriticalSection`/`Mutex`/`Event`/`Semaphore`。`volatile` 僅防編譯器優化,非線程安全萬能藥。現代代碼首選 C++11 標準庫線程設施。