您的位置:首页 > 其它

C8、 用户方式的线程同步

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

一、互锁函数(原子方式运行,速度快!):
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 plDestination,LONG lExchange, LONG lCompared);
//相当于if(*plDestination == lCompared) *plDestination = lExchange;
e) PVOID InterLockedCompareExchange Pointer(PVOID* ppvDestination,PVOID pvExchange, PVOID pvCompared);
f) 老函数:
LONG InterlockedIncrement(PLONG plAdded);
LONG InterlockedDecrement(PLONG plAdded);
二、关键代码段(临界段)
a) 用CRITICAL_SECTION结构变量;
b) 在任何需要访问公共资源处,封装在函数对中:EnterCriticalSection、LeaveCriticalSection。
c) 如果有多个不是一道使用的资源,为每个资源设立CRITICAL_SECTION变量。如果同时访问这多个资源,分别使用EnterCriticalSection、LeaveCriticalSection,并且按照完全相同的顺序请求访问。不要长时间运行关键代码段,如不能避免,可用临时变量。
d) 如果动态创建CRITICAL_SECTION结构,使用前需初始化(VOID InitializeCriticalSection(pcs);),用完后需释放(VOID DeleteCriticalSection(pcs);)
e) 如果不允许调用线程进入等待状态,可以用:BOOL TryEnterCriticalSection(pcs);
如果返回FALSE(不能访问),则转到执行其他操作(而EnterCriticalSection将进入等待)。
f) 使用循环锁(避免线程转入内核方式而降低性能)。
i. 需先初始化:BOOL InitializeCriticalSectionAndSpinCount(pcs, dwSpinCount);dwSpinCount为循环次数(4000?)(单处理器无效);
ii. 改变循环次数:DWORD SetCriticalSectionSpinCount(pcs, dwSpinCount);
g) 异常:可能失败调用InitializeCriticalSection,用InitializeCriticalSectionAndSpinCount较易跟踪。如果在内存短缺的环境,需预先分配事件内核对象,避免EnterCriticalSection产生EXCEPTION_INVALID_HANDLE。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: