歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux平台用C++封裝線程讀寫鎖

Linux平台用C++封裝線程讀寫鎖

日期:2017/3/1 10:02:32   编辑:Linux編程

在Linux平台上已經有現成的線程讀寫鎖pthread_rwlock_t以及相關API,現將這些API封裝成與Win32平台上相同的接口,以便於編寫跨平台程序。這些API包括pthread_rwlock_init,pthread_rwlock_rdlock,pthread_rwlock_tryrdlock,pthread_rwlock_wrlock,pthread_rwlock_trywrlock,pthread_rwlock_unlock,pthread_rwlock_destroy,可在Linux在線手冊上查閱它們的說明。下邊的代碼在VS2005中編輯,在Fedora 13虛擬機中編譯,測試通過。

RWLockImpl.h

#ifndef _RWLockImpl_Header
#define _RWLockImpl_Header

#include <iostream>
#include <pthread.h>
#include <errno.h>
#include <assert.h>

using namespace std;

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

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

private:
pthread_rwlock_t m_rwl;
};

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

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