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

Windows C++ 多執行緒程式設計入門:CreateThread、互斥體、同步與常見陷阱

     編輯:關於C語言

執行緒建立 API 對比

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 (CRITICAL_SECTION):進程內輕量級鎖,效能優於 Mutex,InitializeCriticalSection/EnterCriticalSection/LeaveCriticalSection。
  • Event (CreateEvent):手動/自動重置,適合一對多通知。
  • Semaphore (CreateSemaphore):計數同步,生產者-消費者。
  • Condition Variable (Vista+ InitializeConditionVariable):配合 Critical Section 實作等待/通知模式。

常見陷阱與最佳實踐

  1. CRT 兼容性:永不混用 CreateThread 與 CRT 函數,改用 _beginthreadex 或 std::thread。
  2. 執行緒區域儲存 (TLS):TlsAlloc/TlsSetValue/TlsGetValue 或 C++11 thread_local。
  3. 堆疊大小:預設 1MB,可透過連結器 /STACK 或 CreateThread 參數調整。
  4. 優先權:SetThreadPriority,避免優先權反轉。
  5. 結束方式:執行緒函數 return 或 _endthreadex,勿呼叫 TerminateThread (資源洩漏、鎖永不釋放)。
  6. 例外處理:執行緒內部必須自行捕獲例外,不可跨執行緒傳播。

現代 C++ 建議

新專案優先使用 std::thread, std::mutex, std::condition_variable, std::atomic, std::future/std::async,配合 RAII 鎖 (std::lock_guard, std::unique_lock) 撰寫安全、可移植的多執行緒程式碼。

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