免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1142 | 回复: 0

临界区 CRITICAL_SECTION [复制链接]

论坛徽章:
0
发表于 2013-06-27 15:41 |显示全部楼层
先定义一个临界区对象:CRITICAL_SECTION cs;

这个CRITICAL_SECTION数据类型是一个结构,但是其中的字段只能由Windows内部使用。这个临界区对象必须首先被程序中的某个线程初始化,通过调用InitializeCriticalSection(&cs);这样就创建了一个名为cs的临界区。

当临界区对象被初始化后,线程可以通过下面的调用进入临界区:EnterCriticalSection(&cs);这时,线程“拥有”临界区对象。

线程离开临界区:LeaveCriticalSection(&cs);

当临界区不再被程序所需要时,可以通过调用DeleteCriticalSection(&cs);将其删除,该函数释放所有被分配来维护此临界区对象的系统资源。

若两个线程都需要拥有临界区时,一个线程已经拥有临界区,那么另一个线程在调用EnterCriticalSection(&cs);函数中被挂起,只有当第一个线程通过调用LeaveCriticalSection(&cs);离开临界区时,函数才会返回,被挂起的那个线程拥有临界区,其函数调用也将返回,允许线程继续执行。



也就是说,当希望一段代码想不被打断,一次执行完时,可以在其前面调用EnterCriticalSection(&cs);此代码末尾调用DeleteCriticalSection(&cs);

另外,EnterCriticalSection(&cs);和DeleteCriticalSection(&cs);必须成对出现。而且还要注意,只把必要的代码放入临界区中,因为如果从属线程在它自己的临界区中花费了一段长的时间,那么它可能会将主线程阻止过分长的一段时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP