知识点概述:
互锁函数的原子访问:(单个值)
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
有用的提示和技巧
每个共享资源使用一个关键区
同时访问多个资源时注意关键的顺序保持一致,否则会死锁
不要长时间运行关键区,使用临时变量在关键区外执行长时间的操作