Windows多线程同步系列之二-----关键区
2015-07-29 14:57
120 查看
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权。
关键区同步主要有以下几个API
初始化关键区对象,无返回值,传入一个关键区对象的指针。
该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针
该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数
将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。
该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,而LeaveCriticalSection是释放
关键区所有权,离开关键区。
我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写
运行截图:
关键区同步主要有以下几个API
初始化关键区对象,无返回值,传入一个关键区对象的指针。
该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针
该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有权,那么该函数
将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。
该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,而LeaveCriticalSection是释放
关键区所有权,离开关键区。
我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写
#include <windows.h> #include <stdio.h> static int number=10; CRITICAL_SECTION CriticalSection; DWORD WINAPI ThreadOne(LPVOID lpParameter) { printf("窗口1售票开始:\n"); while(1) { EnterCriticalSection(&CriticalSection); if(number>0) { printf("窗口1售出第%d张票...\n",number); number--; Sleep(1000); } LeaveCriticalSection(&CriticalSection); Sleep(100); } return 0; } DWORD WINAPI ThreadTwo(LPVOID lpParameter) { printf("窗口2售票开始:\n"); while(1) { EnterCriticalSection(&CriticalSection); if(number>0) { printf("窗口2售出第%d张票...\n",number); Sleep(1000); number--; } LeaveCriticalSection(&CriticalSection); Sleep(100); } return 0; } int main() { HANDLE HOne,HTwo; InitializeCriticalSection(&CriticalSection); printf("***********************vpoet******************\n"); HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL); HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL); CloseHandle(HOne); CloseHandle(HTwo); while(TRUE) { if(number==0) { printf("不好意思,票卖完了!\n"); DeleteCriticalSection(&CriticalSection); return 0; } else { continue; } } return 0; }
运行截图:
相关文章推荐
- 如何将资源id转换为Uri,适用于Fresco.setImageURI();
- php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
- android 实现分享功能
- 黑马程序员--iOS--Objective-C基础 (一)
- 数据库禁止远程连接问题
- linux上安装SVN
- poj-1068 Parencodings
- windows dumpbin工具
- 杂七杂八
- Android学习心得(9) --- ndk-build脚本参数用法
- TP框架中隐藏的预处理函数,前置钩子
- 为什么VC经常输出烫烫烫烫烫烫烫烫
- Sublime编辑器快捷键
- JS代码片段:判断一个元素是否进入可视区域
- C++ STL之vector详解
- 为什么VC经常输出烫烫烫烫烫烫烫烫
- git全部常用命令详解
- Python 字符串相加问题
- tomcat内存溢出问题详解
- 数字图像处理03(卷积、滤波、边缘检测——算法原理)