| API | 適用場景 | 備註 |
|---|---|---|
CreateThread | 純 Win32 API,不使用 C 執行期庫 | 若使用 CRT (malloc, iostream 等) 嚴禁直接呼叫 |
_beginthreadex | 使用 CRT 的 C/C++ 程式 | 正確初始化執行緒區域儲存 (TLS)、CRT 內部狀態,**必須使用** |
std::thread (C++11) | 現代跨平台 C++ | 封裝平台 API,RAII 管理,首選方案 |
HANDLE hMutex = CreateMutex(NULL, FALSE, "Global\\MyAppMutex");
WaitForSingleObject(hMutex, INFINITE);
// 臨界區操作 (賣票、修改共享變數)
ReleaseMutex(hMutex);
Global\\ 前綴需權限)。WaitForSingleObject 返回 WAIT_ABANDONED 表示前擁有者異常終止,需檢查資料一致性。// 全域共享資料
int tickets = 10;
HANDLE hMutex;
DWORD WINAPI SellThread(LPVOID) {
while (true) {
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0) {
int myTicket = tickets--;
printf("Thread %lu sells ticket %d\n", GetCurrentThreadId(), myTicket);
} else {
ReleaseMutex(hMutex);
break;
}
ReleaseMutex(hMutex);
Sleep(1); // 模擬處理時間
}
return 0;
}
int main() {
hMutex = CreateMutex(NULL, FALSE, NULL);
HANDLE h1 = (HANDLE)_beginthreadex(NULL, 0, SellThread, NULL, 0, NULL);
HANDLE h2 = (HANDLE)_beginthreadex(NULL, 0, SellThread, NULL, 0, NULL);
WaitForMultipleObjects(2, (HANDLE[]){h1, h2}, TRUE, INFINITE);
CloseHandle(h1); CloseHandle(h2); CloseHandle(hMutex);
return 0;
}
CRITICAL_SECTION):進程內輕量級鎖,效能優於 Mutex,InitializeCriticalSection/EnterCriticalSection/LeaveCriticalSection。CreateEvent):手動/自動重置,適合一對多通知。CreateSemaphore):計數同步,生產者-消費者。InitializeConditionVariable):配合 Critical Section 實作等待/通知模式。CreateThread 與 CRT 函數,改用 _beginthreadex 或 std::thread。TlsAlloc/TlsSetValue/TlsGetValue 或 C++11 thread_local。/STACK 或 CreateThread 參數調整。SetThreadPriority,避免優先權反轉。return 或 _endthreadex,勿呼叫 TerminateThread (資源洩漏、鎖永不釋放)。新專案優先使用 std::thread, std::mutex, std::condition_variable, std::atomic, std::future/std::async,配合 RAII 鎖 (std::lock_guard, std::unique_lock) 撰寫安全、可移植的多執行緒程式碼。