跨平台中对于 读写锁(rwlock) 的包装
2013-11-02 14:36
351 查看
读写锁(rwlock)的跨平台包装,支持以下平台: 操作系统linux、windows,编译器vc、gcc、mingw
跨平台宏(platform.hpp)的定义参见另一篇博文,当然截取代码实现时可以换成自己习惯的定义。跨平台中条件编译的使用使得代码不是那么容易看,但是还好每个函数只有一两句话
windows/VC下使用系统API实现,其他情况下使用 pthread 提供的自旋锁 pthread_rwlock_t
跨平台宏(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 */
相关文章推荐
- STC12C5A60S2笔记6(中断)
- Linux经久不衰的应用程序
- ASP.NET 如何使用 SqlTransaction
- hdu 1170 Balloon Comes! 水的很 !!!!!!!!!
- C#:在catch中return,会执行finally吗?
- android开发环境的搭建,基于eclipse.最后会附上一些参考网址算是一个合集给大家
- c++练习中遇到的问题和解决
- hdu 2544
- 事件CEvent的使用 .
- 事件CEvent的使用 .
- web.xml之<context-param>与<init-param>的区别
- 倪光南:开源软件人才需求将日趋旺盛
- 面试题分析:我的Twitter技术面试失败了
- 事件CEvent的使用 .
- hdu 2544
- 事件CEvent的使用 . 分类: VC++ 2013-11-02 14:31 499人阅读 评论(0) 收藏
- Android设备相关配置
- ASP.NET执行cmd命令
- POJ P1611 The Suspects
- 在ibatis中为什么要加上这些代码?<!DOCTYPE sqlMapConfig xxx> <!DOCTYPE sqlMap xxx>