歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

在Win32下用C++實現多線程讀寫鎖

讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。這種鎖相對於自旋鎖而言,能提高並發性,因為在多處理器系統中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯CPU數。寫者是排他性的,一個讀寫鎖同時只能有一個寫者或多個讀者(與CPU數相關),但不能同時既有讀者又有寫者。

現在Win32的API,用C++實現自己的讀寫鎖。這組API包括:CreateMutex,CreateEvent,WaitForSingleObject,WaitForMultipleObjects,ResetEvent,ReleaseMutex,SetEvent,CloseHandle。以下代碼在VS2005下,已經編譯通過。

相關鏈接:Linux平台用C++封裝線程讀寫鎖 http://www.linuxidc.com/Linux/2013-01/78582.htm

RWLockImpl.h

#ifndef _RWLockImpl_Header
#define _RWLockImpl_Header

#include <assert.h>
#include <iostream>
#include <Windows.h>
#include <process.h>

using namespace std;

/*
 讀寫鎖允許當前的多個讀用戶訪問保護資源,但只允許一個寫讀者訪問保護資源
*/

//-----------------------------------------------------------------
class CRWLockImpl
{
protected:
 CRWLockImpl();
 ~CRWLockImpl();
 void ReadLockImpl();
 bool TryReadLockImpl();
 void WriteLockImpl();
 bool TryWriteLockImpl();
 void UnlockImpl();

private:
 void AddWriter();
 void RemoveWriter();
 DWORD TryReadLockOnce();

 HANDLE  m_mutex;
 HANDLE  m_readEvent;
 HANDLE  m_writeEvent;
 unsigned m_readers;
 unsigned m_writersWaiting;
 unsigned m_writers;
};

//-----------------------------------------------------------------

class CMyRWLock: private CRWLockImpl
{
public:

 //創建讀/寫鎖
 CMyRWLock(){};

 //銷毀讀/寫鎖
 ~CMyRWLock(){};

 //獲取讀鎖
 //如果其它一個線程占有寫鎖,則當前線程必須等待寫鎖被釋放,才能對保護資源進行訪問
 void ReadLock();

 //嘗試獲取一個讀鎖
 //如果獲取成功,則立即返回true,否則當另一個線程占有寫鎖,則返回false
 bool TryReadLock();

 //獲取寫鎖
 //如果一個或更多線程占有讀鎖,則必須等待所有鎖被釋放
 //如果相同的一個線程已經占有一個讀鎖或寫鎖,則返回結果不確定
 void WriteLock();

 //嘗試獲取一個寫鎖
 //如果獲取成功,則立即返回true,否則當一個或更多其它線程占有讀鎖,返回false
 //如果相同的一個線程已經占有一個讀鎖或寫鎖,則返回結果不確定
 bool TryWriteLock();

 //釋放一個讀鎖或寫鎖
 void Unlock();

private:
 CMyRWLock(const CMyRWLock&);
 CMyRWLock& operator = (const CMyRWLock&);
};

inline void CMyRWLock::ReadLock()
{
 ReadLockImpl();
}

inline bool CMyRWLock::TryReadLock()
{
 return TryReadLockImpl();
}

inline void CMyRWLock::WriteLock()
{
 WriteLockImpl();
}

inline bool CMyRWLock::TryWriteLock()
{
 return TryWriteLockImpl();
}

inline void CMyRWLock::Unlock()
{
 UnlockImpl();
}


#endif

Copyright © Linux教程網 All Rights Reserved