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 |
////////////////////////////////////////////////////////////
// Copyright (C) Alax.Info, 2006-2010
// http://alax.info
//
// A permission to use the source code is granted as long as reference to
// source website http://alax.info is retained.
//
// Created by Roman Ryltsov roman@alax.info
//
// $Id$
#include "stdafx.h"
SRWLOCK g_Lock;
LONG g_nRecursiveSharedLockLine = 0;
LONG g_nExclusiveLockLine = 0;
LONG GetLine(LONG& nLineVariable) throw()
{
return InterlockedAdd(&nLineVariable, 0);
}
VOID SetLine(LONG& nLineVariable, LONG nLine) throw()
{
InterlockedExchange(&nLineVariable, nLine);
}
DWORD WINAPI RecursiveSharedLock(INT_PTR*)
{
for(; ; )
{
SetLine(g_nRecursiveSharedLockLine, __LINE__);
AcquireSRWLockShared(&g_Lock);
SetLine(g_nRecursiveSharedLockLine, __LINE__);
AcquireSRWLockShared(&g_Lock);
SetLine(g_nRecursiveSharedLockLine, __LINE__);
ReleaseSRWLockShared(&g_Lock);
SetLine(g_nRecursiveSharedLockLine, __LINE__);
ReleaseSRWLockShared(&g_Lock);
SetLine(g_nRecursiveSharedLockLine, __LINE__);
}
}
DWORD WINAPI ExclusiveLock(INT_PTR*)
{
for(; ; )
{
SetLine(g_nExclusiveLockLine, __LINE__);
AcquireSRWLockExclusive(&g_Lock);
SetLine(g_nExclusiveLockLine, __LINE__);
ReleaseSRWLockExclusive(&g_Lock);
SetLine(g_nExclusiveLockLine, __LINE__);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
InitializeSRWLock(&g_Lock);
CHandle SharedLockThread, ExclusiveLockThread;
SharedLockThread.Attach(AtlCreateThread<INT_PTR>(&RecursiveSharedLock, 0));
//ExclusiveLockThread.Attach(AtlCreateThread<INT_PTR>(&ExclusiveLock, 0));
for(; ; )
{
Sleep(1000);
_tprintf(_T("g_nRecursiveSharedLockLine %d, g_nExclusiveLockLine %d\n"), GetLine(g_nRecursiveSharedLockLine), GetLine(g_nExclusiveLockLine));
}
return 0;
} |