1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

#pragma once /* 编译一次 */
class CCriticalSection /* 临界区封装类 */
{
public: CCriticalSection( DWORD dwSpinCount = 0 ) /* 使用旋转锁 参考值 4000 不为0 则会创建一个事件内核对象(多线程同时访问这个事件内核对象才有用) */
{
m_bInit = FALSE;
if ( dwSpinCount == 0 )
{
InitializeCriticalSection();
} else
InitializeCriticalSectionAndSpinCount( dwSpinCount );
}


~CCriticalSection()
{
DeleteCriticalSection();
}


void InitializeCriticalSection()
{
if ( m_bInit )
{
PRINTFUNDEBUGINFO( "已初始化" );
return;
}
::InitializeCriticalSection( &m_cs );
m_bInit = TRUE;
}


BOOL InitializeCriticalSectionAndSpinCount( DWORD dwSpinCount ) /* 带旋转锁初始化 参考值 4000 如果只有一个cpu处理器 则忽略 dwspincount */
{
if ( m_bInit )
{
PRINTFUNDEBUGINFO( "已初始化" );
return(FALSE);
}
return(m_bInit = ::InitializeCriticalSectionAndSpinCount( &m_cs, dwSpinCount ) );
}


DWORD SetCriticalSectionSpinCount( DWORD dwSpinCount ) /* 改变旋转锁次数 如果是单处理器 同样忽略 dwspincount */
{
return(::SetCriticalSectionSpinCount( &m_cs, dwSpinCount ) );
}


void EnterCriticalSection() /* 进入临界区 */
{
::EnterCriticalSection( &m_cs );
}


void LeaveCriticalSection() /* 离开临界区 */
{
::LeaveCriticalSection( &m_cs );
}


BOOL TryEnterCriticalSection() /* 尝试进入临界区(立即返回) 如果返回值为true 必须对应一个 leavecriticalsection 如果为false 则不可进入 */
{
return(::TryEnterCriticalSection( &m_cs ) );
}


void DeleteCriticalSection() /*删除临界区 */
{
if ( !m_bInit )
{
PRINTFUNDEBUGINFO( "无对象" );
return; /* 无对象 */
}
m_bInit = FALSE; ::DeleteCriticalSection( &m_cs );
}


protected: private: BOOL m_bInit; /* 是否已初始化 */
CRITICAL_SECTION m_cs; /* 私有结构 */
};

核心编程看到第八章 “关键段和旋转锁” 趁热打铁 整一下

感谢您的阅读,本文由 smallwhite's Blog 版权所有。如若转载,请注明出处:smallwhite's Blog(https://smallwhite.ml/pub/win32/critical-package-class.html
vs2010 vc6 编译体积优化
一个神奇的shellcode