关键代码段是工作在用户方式下,关键代码段(临界区)是指一小代码段,在代码能够执行前,他必须独占对某些资源的访问权。 每个临界区对象对应于一个临界资源。
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Func1Proc(LPVOID lpParameter);
DWORD WINAPI Func2Proc(LPVOID lpParameter);
int tickets = 100;
CRITICAL_SECTION g_cs;//创建一个全局的临界区对象,在访问临界资源前,一定要验证该对象
int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, Func1Proc, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Func2Proc, NULL, 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs); //初始化该临界区对象,设置为允许访问
Sleep(4000);
DeleteCriticalSection(&g_cs);//释放该临界区对象的资源
return 0;
}
DWORD WINAPI Func1Proc(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&g_cs);//验证临界区对象,如果允许访问,则进入临界区,同时获得该对象的所有权
if (tickets > 0)
{
Sleep(1);
cout<<"Thread1 sell ticket:"<<tickets--<<endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs);//释放对该临界区对象的所有权
}
return 0;
}
DWORD WINAPI Func2Proc(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&g_cs);
if (tickets > 0)
{
Sleep(1);
cout<<"Thread2 sell ticket:"<<tickets--<<endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs);
}
return 0;
}
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Func1Proc(LPVOID lpParameter);
DWORD WINAPI Func2Proc(LPVOID lpParameter);
int tickets = 100;
CRITICAL_SECTION g_cs;//创建一个全局的临界区对象,在访问临界资源前,一定要验证该对象
int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, Func1Proc, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Func2Proc, NULL, 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs); //初始化该临界区对象,设置为允许访问
Sleep(4000);
DeleteCriticalSection(&g_cs);//释放该临界区对象的资源
return 0;
}
DWORD WINAPI Func1Proc(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&g_cs);//验证临界区对象,如果允许访问,则进入临界区,同时获得该对象的所有权
if (tickets > 0)
{
Sleep(1);
cout<<"Thread1 sell ticket:"<<tickets--<<endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs);//释放对该临界区对象的所有权
}
return 0;
}
DWORD WINAPI Func2Proc(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&g_cs);
if (tickets > 0)
{
Sleep(1);
cout<<"Thread2 sell ticket:"<<tickets--<<endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs);
}
return 0;
}