Windows多线程同步系列之二-----关键区
2016-04-07 21:02
232 查看
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权。
关键区同步主要有以下几个API
![](http://images0.cnblogs.com/blog2015/653903/201507/291436350487773.jpg)
初始化关键区对象,无返回值,传入一个关键区对象的指针。
![](http://images0.cnblogs.com/blog2015/653903/201507/291439591575149.jpg)
该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针
![](http://images0.cnblogs.com/blog2015/653903/201507/291442035321985.jpg)
该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数
将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。
![](http://images0.cnblogs.com/blog2015/653903/201507/291446014393036.jpg)
该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,而LeaveCriticalSection是释放
关键区所有权,离开关键区。
我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写
运行截图:
![](http://images0.cnblogs.com/blog2015/653903/201507/291457078763770.jpg)
关键区同步主要有以下几个API
![](http://images0.cnblogs.com/blog2015/653903/201507/291436350487773.jpg)
初始化关键区对象,无返回值,传入一个关键区对象的指针。
![](http://images0.cnblogs.com/blog2015/653903/201507/291439591575149.jpg)
该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针
![](http://images0.cnblogs.com/blog2015/653903/201507/291442035321985.jpg)
该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数
将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。
![](http://images0.cnblogs.com/blog2015/653903/201507/291446014393036.jpg)
该函数与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 }
运行截图:
![](http://images0.cnblogs.com/blog2015/653903/201507/291457078763770.jpg)
相关文章推荐
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- 阻塞非阻塞与异步同步问题
- 第六周上机实践项目-武器类
- hexo干货系列:(七)hexo安装统计插件
- ARC-数据类型需要释放的情况
- 世界名牌大学公开课集
- Python Numpy的简单使用
- java中值传递问题
- Java 获取指定时间的前一天Date
- JAVA下载文件
- nginx启动、重启、关闭
- 第五周作业
- 第五周作业 价值观作业
- gulp完全安装教程
- uploadify文件批量上传
- 游戏开发项目进度管理(17)
- NSString 去除空格方法 ios
- 高级SQL语句简单举例
- 项目布署到linux
- 学习表格