免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1403 | 回复: 0
打印 上一主题 下一主题

临界区 CRITICAL_SECTION [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(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);必须成对出现。而且还要注意,只把必要的代码放入临界区中,因为如果从属线程在它自己的临界区中花费了一段长的时间,那么它可能会将主线程阻止过分长的一段时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP