/*线程同步问题---火车站售票安排系统模拟系统
// 临界区,也称关键代码段,它是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。
//通常把多线程中访问统一资源的那部分代码当作临界区,从而达到线程同步的目的。
利用临界区对象实现线程同步
*/
#include<Windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);
int tickets = 1;
CRITICAL_SECTION cs;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&cs);//初始化临界区对象
Sleep(5000);
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&cs);//获取临界区对象所有权
if (tickets <= 100)
{
Sleep(1);
cout << "thread 1 sell ticket:" << tickets++ << endl;
}
else
break;
LeaveCriticalSection(&cs);//释放临界区对象所有权
//void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSetion)该函数实现释放临界区对象
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
while (true)
{
EnterCriticalSection(&cs);
if (tickets <= 100)
{
Sleep(1);
cout << "thread2 sell tickets:" << tickets++ << endl;
}
else
break;
LeaveCriticalSection(&cs);
}
return 0;
}