您的位置:首页 > 其它

Windows多线程同步系列之二-----关键区

2016-04-07 21:02 232 查看
关键区对象为: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售票开始:\n");
10     while(1)
11     {
12         EnterCriticalSection(&CriticalSection);
13         if(number>0)
14         {
15             printf("窗口1售出第%d张票...\n",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售票开始:\n");
27     while(1)
28     {
29         EnterCriticalSection(&CriticalSection);
30         if(number>0)
31         {
32             printf("窗口2售出第%d张票...\n",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******************\n");
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("不好意思,票卖完了!\n");
57             DeleteCriticalSection(&CriticalSection);
58             return 0;
59         }
60         else
61         {
62             continue;
63         }
64     }
65
66     return 0;
67 }


 

运行截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: