使用 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) 等待完成。WaitForMultipleObjects 等待線程真正結束,而非固定 Sleep。std::lock_guard 配合 std::mutex,C++11+)。std::atomic 或配合鎖保護。