root/trunk/SrwLockTest01/SrwLockTest01.cpp

User picture

Author: alax

Revision: 306 («Previous)


File Size: 1.79 KB

(November 29, 2010 14:47 UTC) Over 1 year ago


  

 
Show/hide line numbers
////////////////////////////////////////////////////////////
// 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;
}