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

Windows 多線程編程示例:互斥量同步售票模擬

     編輯:關於C++

MultiThread.cpp:雙線程競態條件演示

使用 Windows API CreateThread、CreateMutex、WaitForSingleObject 實現兩個線程安全售罄 100 張票。

完整代碼

// MultiThread.cpp : 控制台應用程序入口點
#include "stdafx.h"
#include 
#include 

using namespace std;

int tickets = 100;
HANDLE hMutex;

DWORD WINAPI Fun1Proc(LPVOID lp);
DWORD WINAPI Fun2Proc(LPVOID lp);

int _tmain(int argc, _TCHAR* argv[]) {
    HANDLE hThread1, hThread2;
    hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
    hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);
    hMutex = CreateMutex(NULL, FALSE, NULL);

    Sleep(2000);
    system("pause");
    return 0;
}

DWORD WINAPI Fun1Proc(LPVOID lp) {
    while (1) {
        WaitForSingleObject(hMutex, INFINITE);
        if (tickets > 0) {
            Sleep(10);
            cout << "thread1 sell ticket." << tickets-- << endl;
        } else break;
        ReleaseMutex(hMutex);
    }
    return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lp) {
    while (1) {
        WaitForSingleObject(hMutex, INFINITE);
        if (tickets > 0) {
            cout << "thread2 sell ticket." << tickets-- << endl;
        } else break;
        ReleaseMutex(hMutex);
    }
    return 0;
}

關鍵點解析

  • hMutex 保護共享變量 tickets,確保檢查-修改操作原子性。
  • WaitForSingleObject(hMutex, INFINITE) 阻塞等待鎖;ReleaseMutex 釋放。
  • 線程函數返回 DWORD,參數 LPVOID。
  • 主線程創建線程後立即 CloseHandle(僅關閉句柄,不終止線程),靠 Sleep(2000) 等待完成。

改進建議

  1. 主線程應用 WaitForMultipleObjects 等待線程真正結束,而非固定 Sleep。
  2. 互斥量應在創建線程之前創建,避免競態窗口。
  3. 使用 RAII 封裝鎖操作(如 std::lock_guard 配合 std::mutex,C++11+)。
  4. 票數變量宜用 std::atomic 或配合鎖保護。

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