c++ 多线程 临界区
来源:互联网 发布:淘宝上架时间周期 编辑:程序博客网 时间:2024/06/14 17:09
临界区只有4个函数:
函数功能:初始化
void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:定义关键段变量后必须先初始化。
函数功能:销毁
void DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:用完之后记得销毁。
函数功能:进入临界区
void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
函数说明:系统保证各线程互斥的进入临界区。
由于线程切换到等待状态开销较大,所以windows旋转让线程处于一个循环锁中循环,一段时间后才切换称等待。
函数功能:离开临界区
void LeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);
临界区可以用于线程间的互斥,但是不能用于同步,由于临界区是指进入 这个临界区后,线程才可以进行下一部操作,如果理解区中已有其他线程,则不可以进入新的线程,线程要等待临界区中已有线程离开。而主线程拥有对所有数据的访问权限,导致主线程可以在子线程之前修改参数。
CRITICAL_SECTION cs;typedef struct param{int a;bool b;double c;string d;};unsigned int __stdcall threadfun1(LPVOID p){Sleep(100);EnterCriticalSection(&cs);param* funparam = (param*) p;cout<<"fun1 running:"<<funparam->d<<endl;funparam->c *= funparam->a; cout<<"ans:"<<funparam->c<<endl;LeaveCriticalSection(&cs);return 0;}DWORD __stdcall threadfun2(LPVOID p){Sleep(100);EnterCriticalSection(&cs);param* funparam = (param*) p;cout<<"fun2 running:"<<funparam->d<<endl;funparam->c /= funparam->a; cout<<"ans:"<<funparam->c<<endl;LeaveCriticalSection(&cs);return 0;}int main(){param p={5,true,9.995,"hello world"};InitializeCriticalSection(&cs);HANDLE newthread1 = (HANDLE)_beginthreadex(NULL,0,threadfun1,&p,0,NULL);HANDLE newthread2 = CreateThread(NULL,0,threadfun2,&p,0,NULL);WaitForSingleObject(newthread2,INFINITE);WaitForSingleObject(newthread1,INFINITE);DeleteCriticalSection(&cs);
临界区实现的是互斥,临界区中有全部的系统资源的控制权,当一个线程进入临界区后,便获得了这些资源,设置一个临界区,通过临界区中只能有一个线程,使资源也只有一个线程在一个时刻可以访问,即互斥。
0 0
- 多线程(C++)临界区Critical Sections问题
- 多线程-临界区模式
- 多线程临界区编程
- VC多线程临界区
- VC多线程临界区
- VC多线程临界区
- 临界区:多线程同步
- VC多线程临界区
- 多线程临界区Demo
- 多线程与临界区
- 多线程锁:临界区
- VC多线程临界区
- c++ 多线程 临界区
- 多线程--临界区
- 多线程 同步 临界区
- 多线程临界区
- 多线程—临界区
- 多线程 临界区CRITICAL_SECTION
- 第三方网站使用qq登录
- 数据库表删除之drop table xxx (某公司实习生招聘笔试试题)
- UVA - 156 Ananagrams
- [1218]THE DRUNK JAILER (水题)POJ
- Everything原理(部分)
- c++ 多线程 临界区
- 解决easyui和bootstrap兼容问题
- 【Cocos2d-x 手游研发小技巧】图片资源加密,Lua文件加密
- String字符串对象的创建及管理
- CF 250 C. The Child and Toy
- Jm18.6绘制量化步长变化时,码率和psnr的关系
- 什么是java序列化,如何实现java序列化?
- 傅里叶变换的完美总结【完整版】
- android 开发遇到的问题2014-09-25