C8、 用户方式的线程同步

(用户方式同步的优点:同步速度快;但是,锁函数缺点:单值,不能使线程进入等待状态;关键代码段:单进程中的线程实施同步,易死锁)

 

一、互锁函数(原子方式运行,速度快!):

a)         LONG InterLockedExchangeAdd(PLONG plAdded, LONG lIncrement);

//相当于*plAdded += lIncrement;

b)        LONG InterLockedExchange(PLONG plTarget, LONG lValue);

//相当于* plTarget = lValue;

c)        PVOID InterLockedExchangePointer(PVOID* ppvTarget, PVOID pvValue); //同上

d)        PVOID InterLockedCompareExchange (PLONG plDestinationLONG lExchange, LONG lCompared);

//相当于if(*plDestination == lCompared) *plDestination = lExchange;

e)         PVOID InterLockedCompareExchange Pointer(PVOID* ppvDestinationPVOID pvExchange,  PVOID pvCompared);

f)         老函数:

LONG InterlockedIncrement(PLONG plAdded);

LONG InterlockedDecrement(PLONG plAdded);

二、关键代码段(临界段)

a)         CRITICAL_SECTION结构变量;

b)        在任何需要访问公共资源处,封装在函数对中:EnterCriticalSectionLeaveCriticalSection

c)        如果有多个不是一道使用的资源,为每个资源设立CRITICAL_SECTION变量。如果同时访问这多个资源,分别使用EnterCriticalSectionLeaveCriticalSection,并且按照完全相同的顺序请求访问。不要长时间运行关键代码段,如不能避免,可用临时变量。

d)        如果动态创建CRITICAL_SECTION结构,使用前需初始化(VOID InitializeCriticalSection(pcs);,用完后需释放(VOID DeleteCriticalSection(pcs);

e)         如果不允许调用线程进入等待状态,可以用:BOOL TryEnterCriticalSectionpcs;

如果返回FALSE(不能访问),则转到执行其他操作(而EnterCriticalSection将进入等待)。

f)         使用循环锁(避免线程转入内核方式而降低性能)。

                         i.              需先初始化:BOOL InitializeCriticalSectionAndSpinCountpcs dwSpinCount);dwSpinCount为循环次数(4000?)(单处理器无效);

                       ii.              改变循环次数:DWORD SetCriticalSectionSpinCount(pcs, dwSpinCount);

g)        异常:可能失败调用InitializeCriticalSection,用InitializeCriticalSectionAndSpinCount较易跟踪。如果在内存短缺的环境,需预先分配事件内核对象,避免EnterCriticalSection产生EXCEPTION_INVALID_HANDLE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值