【Windows核心编程笔记】第八章 用户模式中的线程同步

知识点概述:

互锁函数的原子访问:(单个值

InterlockedExchangeAdd(&g_num,1) 递增1

InterlockedExchange(PLONG,LONG) 参数2的值取代参数1(循环锁中很有用)

InterlockedExchangePointer(PVOID*,PVOID) 参数2的值取代参数1

InterlockedCompareExchangePointer 比较

InterlockedCompareExchange 比较

 

关键区实现线程同步

InitializeCriticalSection(使用之前必须初始化)

EnterCriticalSection

….(执行代码)

LeaveCriticalSection

DeleteCriticalSection

 

注意使用共享资源的任何代码都必须封装在其中,比如线程1和线程2都操作资源A,则在线程1和线程2中都要加关键区

 

关键区+循环锁

InitializeCriticalSectionAndSpinCount(&cs,4000);

SetCriticalSectionSpinCount(&cs,4000);

单CPU机器上,第二个参数无效

 

使用关键区可能会遇到的问题

初始化时内存可能会由于不足而分配失败(增加异常处理)

多个线程争用关键区时会创建事件对象,在内存不足时此对象会创建失败(增加异常处理)

可以使用InitializeCriticalSectionAndSpinCount来避免异常,返回值是BOOL,而不是VOID

 

有用的提示和技巧

每个共享资源使用一个关键区

同时访问多个资源时注意关键的顺序保持一致,否则会死锁

不要长时间运行关键区,使用临时变量在关键区外执行长时间的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值