Win32线程锁的一种高效实现
Horin|贺勤
Email: horin153@msn.com
Blog: http://blog.csdn.net/horin153/
最近看 MSDN 中的一些资料,有感于世界变化真快,从前掌握的锁的知识实在肤浅;于是毫不犹豫地将其拖入回收站,顺便也有了这篇文章。
在这里我不粘贴 MSDN 中的大段叙述,也不复述锁的知识。仅谈新锁的特点:
1、根据 os 版本来决定线程切换方式: Win9x 用 Sleep, WinNT 用 SwitchToThread。
调用 Sleep(0) 时,调用线程虽会放弃剩余时间片,但仍保持 ready 状态。而 SwitchToThread 会促使 os 重新调度线程,并可能使低优先级的线程运行;该接口在 Win9x 系统中不可用。
2、根据 cpu 个数来决定是否 spin: 单 cpu 直接切换线程, 多 cpu 则 spin。
和 InitializeCriticalSectionAndSpinCount 相似,单处理器系统直接切换线程,不进行 spin 处理。
实现代码如下:
// --------------------- code begin -----------------------
class CSpinInterlocked
{
public:
CSpinInterlocked(DWORD processor_num=1, bool win9x=false, int spin_count=128)
Horin|贺勤
Email: horin153@msn.com
Blog: http://blog.csdn.net/horin153/
最近看 MSDN 中的一些资料,有感于世界变化真快,从前掌握的锁的知识实在肤浅;于是毫不犹豫地将其拖入回收站,顺便也有了这篇文章。
在这里我不粘贴 MSDN 中的大段叙述,也不复述锁的知识。仅谈新锁的特点:
1、根据 os 版本来决定线程切换方式: Win9x 用 Sleep, WinNT 用 SwitchToThread。
调用 Sleep(0) 时,调用线程虽会放弃剩余时间片,但仍保持 ready 状态。而 SwitchToThread 会促使 os 重新调度线程,并可能使低优先级的线程运行;该接口在 Win9x 系统中不可用。
2、根据 cpu 个数来决定是否 spin: 单 cpu 直接切换线程, 多 cpu 则 spin。
和 InitializeCriticalSectionAndSpinCount 相似,单处理器系统直接切换线程,不进行 spin 处理。
实现代码如下:
// --------------------- code begin -----------------------
class CSpinInterlocked
{
public:
CSpinInterlocked(DWORD processor_num=1, bool win9x=false, int spin_count=128)