博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows线程同步【2】临界区
阅读量:7120 次
发布时间:2019-06-28

本文共 1187 字,大约阅读时间需要 3 分钟。

hot3.png

临界区是线程同步的一种实现方式。Windows提供了4个关于临界区的函数(InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,DeleteCriticalSection),要想使用这些函数,必须先有一个临界区变量,

CRITICAL_SECTION cs;

临界区变量,不能复制,不能移动,也不能读取里面的字段(可以取临界区变量的地址)。总而言之,我们在编写程序时,必须把临界区变量当成一个黑箱,一切对临界区的操作必须通过那4个函数来进行。

在使用临界区之前,必须用InitializeCriticalSection函数将其初始化:

InitializeCriticalSection(&cs);

一个线程可以通过EnterCriticalSection函数来进入一个临界区:

EnterCriticalSection(&cs);

一旦一个线程进入了某个临界区,其他线程便不能进入这个临界区。

一个线程可以通过LeaveCriticalSection函数来离开一个临界区:

LeaveCriticalSection(&cs);

当一个线程离开一个临界区之后,其他线程可以进入这个临界区。

当程序不再需要这个临界区时,别忘记将其销毁。

DeleteCriticalSection(&cs);

用法与示例:

临界区的用法是,如果一个变量(记为x)需要被多个线程共享时,那么可以搞一个临界区。任何一个线程在访问x之前,必须先进入临界区,完成对x的访问后,离开临界区。因为一个临界区在同一时刻只允许一个线程进入,这样就保证了x在同一时刻只能被一个线程访问。

在下面的示例中,n是受临界区保护的变量。

#include 
#include 
CRITICAL_SECTION cs;int n = 0;DWORD Thread1(void *){    // 其他代码    EnterCriticalSection(&cs);    ++n;    LeaveCriticalSection(&cs);    // 其他代码}DWORD Thread2(void *){    // 其他代码    EnterCriticalSection(&cs);    n = 5;    LeaveCriticalSection(&cs);    // 其他代码}void main(){    InitializeCriticalSection(&cs);    Sleep(5000);    DeleteCriticalSection(&cs);}

转载于:https://my.oschina.net/jthmath/blog/400510

你可能感兴趣的文章
IP设置-内置服务器-外置服务器
查看>>
注意:.Net Mvc项目暂缓升级jQuery至1.9.0
查看>>
nginx php-fpm安装配置
查看>>
LOJ 10189 仓库建设 ——斜率优化dp
查看>>
洛谷 2827 蚯蚓——相邻两个比较的分析
查看>>
洛谷1220关路灯
查看>>
Construct Binary Tree from Preorder and Inorder Traversal<leetcode>
查看>>
高职院校软件技术专业程序设计课程体系探索(一)
查看>>
C#字符串与char数组互转!
查看>>
Pytorch实战(3)----分类
查看>>
算法46----移除K位数字
查看>>
FreeTextBox3.3.0使用总结
查看>>
360创业故事【转】
查看>>
C++智能指针实现
查看>>
HDU2178 猜数字【数学计算+水题】
查看>>
HDU1318 POJ1590 UVA401 ZOJ1325 Palindromes【回文+入门练习】
查看>>
前端调试-跨域解决方式
查看>>
【C语言学习笔记】字符串拼接的3种方法
查看>>
批处理获取U盘、可移动硬盘的盘符
查看>>
一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)...
查看>>