关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权。
关键区同步主要有以下几个API
初始化关键区对象,无返回值,传入一个关键区对象的指针。
该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针
该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数
将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。
该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,而LeaveCriticalSection是释放
关键区所有权,离开关键区。
我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写
1 #include <windows.h> 2 #include <stdio.h> 3 4 static int number=10; 5 CRITICAL_SECTION CriticalSection; 6 7 DWORD WINAPI ThreadOne(LPVOID lpParameter) 8 { 9 printf("窗口1售票开始: "); 10 while(1) 11 { 12 EnterCriticalSection(&CriticalSection); 13 if(number>0) 14 { 15 printf("窗口1售出第%d张票... ",number); 16 number--; 17 Sleep(1000); 18 } 19 LeaveCriticalSection(&CriticalSection); 20 Sleep(100); 21 } 22 return 0; 23 } 24 DWORD WINAPI ThreadTwo(LPVOID lpParameter) 25 { 26 printf("窗口2售票开始: "); 27 while(1) 28 { 29 EnterCriticalSection(&CriticalSection); 30 if(number>0) 31 { 32 printf("窗口2售出第%d张票... ",number); 33 Sleep(1000); 34 number--; 35 } 36 LeaveCriticalSection(&CriticalSection); 37 Sleep(100); 38 } 39 return 0; 40 } 41 42 43 int main() 44 { 45 HANDLE HOne,HTwo; 46 InitializeCriticalSection(&CriticalSection); 47 printf("***********************vpoet****************** "); 48 HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL); 49 HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL); 50 CloseHandle(HOne); 51 CloseHandle(HTwo); 52 while(TRUE) 53 { 54 if(number==0) 55 { 56 printf("不好意思,票卖完了! "); 57 DeleteCriticalSection(&CriticalSection); 58 return 0; 59 } 60 else 61 { 62 continue; 63 } 64 } 65 66 return 0; 67 }
运行截图: