您的位置:首页 > 其它

跨平台中对于 读写锁(rwlock) 的包装

2013-11-02 14:36 351 查看
读写锁(rwlock)的跨平台包装,支持以下平台: 操作系统linux、windows,编译器vc、gcc、mingw

跨平台宏(platform.hpp)的定义参见另一篇博文,当然截取代码实现时可以换成自己习惯的定义。跨平台中条件编译的使用使得代码不是那么容易看,但是还好每个函数只有一两句话
windows/VC下使用系统API实现,其他情况下使用 pthread 提供的自旋锁 pthread_rwlock_t

/**
* @file -
* @author jingqi
* @date 2012-03-06
* @last-edit 2012-03-06 12:51:37 jingqi
*/

#ifndef ___HEADFILE_409C4713_58BB_467B_A1CB_A8BC6EDA6CFE_
#define ___HEADFILE_409C4713_58BB_467B_A1CB_A8BC6EDA6CFE_

#include <nut/platform/platform.hpp>

#if defined(NUT_PLATFORM_OS_WINDOWS)
#   include <windows.h>
#else
#   include <pthread.h>
#endif

namespace nut
{

class RwLock
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
/** windows下的共享锁是在Windows Vista/Server 2008极其以后的版本中提供的 */
SRWLOCK m_rwlock;
#else
pthread_rwlock_t m_rwlock;
#endif

public:
RwLock()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
::InitializeSRWLock(&m_rwlock);
#else
int rs = pthread_rwlock_init(&m_rwlock, NULL);
assert(0 == rs);
#endif
}

~RwLock()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
/** SRWLock 无需删除或销毁,系统自动执行清理工作 */
#else
int rs = pthread_rwlock_destroy(&m_rwlock);
#endif
}

inline void lockRead()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
::AcquireSRWLockShared(&m_rwlock);
#else
int rs = pthread_rwlock_rdlock(&m_rwlock);
assert(0 == rs);
#endif
}

inline bool trylockRead()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
return FALSE != TryAcquireSRWLockShared(&m_rwlock);
#else
return 0 == pthread_rwlock_tryrdlock(&m_rwlock);
#endif
}

inline void lockWrite()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
::AcquireSRWLockExclusive(&m_rwlock);
#else
int rs = pthread_rwlock_wrlock(&m_rwlock);
assert(0 == rs);
#endif
}

inline bool trylockWrite()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
return FALSE != ::TryAcquireSRWLockExclusive(&m_rwlock);
#else
return 0 == pthread_rwlock_trywrlock(&m_rwlock);
#endif
}

inline void unlockRead()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
::ReleaseSRWLockShared(&m_rwlock);
#else
int rs = pthread_rwlock_unlock(&m_rwlock);
assert(0 == rs);
#endif
}

inline void unlockWrite()
{
#if defined(NUT_PLATFORM_OS_WINDOWS)
::ReleaseSRWLockExclusive(&m_rwlock);
#else
int rs = pthread_rwlock_unlock(&m_rwlock);
assert(0 == rs);
#endif
}
};

}

#endif /* head file guarder */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: