⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rwlock.h

📁 一个管理ie的软件
💻 H
字号:
#ifndef __CRWLock_h__
#define __CRWLock_h__

#define	EnterCriticalSectionTimeout(nTimeout)	{		\
	if ( nTimeout > 0 )									\
	{													\
		for ( int i = 0; ! TryEnterCriticalSection(&m_csLock); i ++ )		\
		{												\
			Sleep(100);									\
			if ( i >= nTimeout * 10 )					\
				return FALSE;							\
		}												\
	}													\
	else if ( nTimeout == 0 )							\
	{													\
		EnterCriticalSection(&m_csLock);				\
	}													\
	else												\
	{													\
		if ( ! TryEnterCriticalSection(&m_csLock))		\
			return FALSE;								\
	}													\
}

////////////////////////////////////////////////////////////////////////////////
// simple R/W lock implementation
// this implementation is only reasonable if write locks are rare

class CRWLock
{
private:
	CRITICAL_SECTION m_csLock;
	long m_nReadLocks;			// count of current read locks

public:
	CRWLock()
	{
		m_nReadLocks = 0;

		InitializeCriticalSection(&m_csLock);
	}

	~CRWLock()
	{
		DeleteCriticalSection(&m_csLock);
	}

	BOOL ReadLock(int nTimeout = 0)
	{
		EnterCriticalSectionTimeout(nTimeout);

		// increment (interlocked because release doesn't do CS) read lock count
		InterlockedIncrement(&m_nReadLocks);

		LeaveCriticalSection(&m_csLock);

		return TRUE;
	}

	void ReadUnlock()
	{
		// interlocked because outside of CS
		InterlockedDecrement(&m_nReadLocks);
	}

	BOOL WriteLock(int nTimeout = 0)
	{
		EnterCriticalSectionTimeout(nTimeout);

		// wait for all read locks to drain
		if ( nTimeout < 0 )
		{
			if ( m_nReadLocks > 0 )
			{
				LeaveCriticalSection(&m_csLock);
				return FALSE;
			}
		}
		else
		{
			int i = 0;
			for (i = 0; m_nReadLocks > 0; i ++)
			{
				Sleep(100);
				if ( nTimeout > 0 && i >= nTimeout * 10 )
				{
					LeaveCriticalSection(&m_csLock);
					return FALSE;
				}
			}
		}

		return TRUE;
	}

	void WriteUnlock()
	{
        LeaveCriticalSection(&m_csLock);
	}
};

#endif //__CRWLock_h__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -