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。
一、互锁函数(原子方式运行,速度快!):
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。
相关文章推荐
- 用户方式中线程同步
- windows核心编程之用户方式中的线程同步
- -【用户方式线程同步】互锁的函数家族
- windows笔记-【用户方式线程同步】互锁的函数家族
- windows笔记-【用户方式线程同步】关键代码段
- 读书笔记:Windows核心编程第八章---用户方式中的线程同步技巧
- 复习笔记之二--用户方式线程同步
- -【用户方式线程同步】关键代码段
- 线程同步的几种方式
- 【转】MySQLroot用户忘记密码解决方案(安全模式,修改密码的三种方式)
- 线程同步控制的几种方式
- MySql 修改root用户密码的方式
- Windows2003使用WEB方式修改域用户密码
- 多用户以一个Map方式缓存带来的性能问题
- SpringMVC基于非注解方式(SimpleUrlHandlerMapping)实现用户数据查询备忘(Intellij idea)
- Chapter08-用户模式下的线程同步
- 用户密码的加密方式
- 采用基类的方式判断用户是否登录(1)
- 禁止用户使用密码的方式登录服务器,让其使用key的方式登录
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法