广东湘恒智能科技有限公司
主营产品: 西门子变频器,西门子PLC\西门子模块、西门子触摸屏、西门子伺服电机、西门子工控机、西门子集成系统、西门子低压、西门子控制单元、西门子CPU,广东省西门子授权代理商,等
SIEMENS吉安市西门子中国总代理商-西门子变频器伺服电机总代理

在所有 Windows 资源同步对象中,CriticalSection(临界区对象,有时被翻译成“关键段”)都是最简单、易用的,能用于防止多线程同时执行其保护的那段代码(临界区代码),即临界区的代码在某一时刻只允许1个线程执行,示意图如下。

图片

Windows没有公开CriticalSection数据结构的定义,我们一般使用如下5个API函数操作临界区对象:








void InitializeCriticalSection(  [out] LPCRITICAL_SECTION lpCriticalSection);
void DeleteCriticalSection(  [in, out] LPCRITICAL_SECTION lpCriticalSection);

InitializeCriticalSection 和 DeleteCriticalSection 用于初始化和销毁 1 个 CRITICAL_SECTION 对象












BOOL TryEnterCriticalSection(  [in, out] LPCRITICAL_SECTION lpCriticalSection);
void EnterCriticalSection(  [in, out] LPCRITICAL_SECTION lpCriticalSection);
void LeaveCriticalSection(  [in, out] LPCRITICAL_SECTION lpCriticalSection);

TryEnterCriticalSection会尝试进入临界区,如果可以进入,则函数返回TRUE;如果无法进入,则立即返回,不会阻塞调用线程,函数返回FALSE。


LeaveCriticalSection函数让调用的线程离开临界区,离开临界区以后,临界区的代码允许其他线程调用EnterCriticalSection进入。


EnterCriticalSection 和 LeaveCriticalSection 之间的代码即临界区代码;调用EnterCriticalSection的线程会尝试进入临界区,如果进入不了,则会阻塞调用线程,直到成功进入或者超时。代码允许其他线程调用EnterCriticalSection进入。


EnterCriticalSection 的超时时间很长,可以在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager 位置修改参数 CriticalSectionTimeout的值进行调整,当然,在实际开发中我们从来不会修改这个值,如果代码等待时间较长且最终超时,就需要检查逻辑设计是否合理。


展开全文
相关产品
拨打电话 微信咨询 发送询价