在 Win32 下用 C++ 实现多线程读写锁


  读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。
  现在Win32的API,用C++实现自己的读写锁。这组API包括:CreateMutex,CreateEvent,WaitForSingleObject,WaitForMultipleObjects,ResetEvent,ReleaseMutex,SetEvent,CloseHandle。以下代码在VS2005下,已经编译通过。
  RWLockImpl.h
  01.#ifndef _RWLockImpl_Header
  02.#define _RWLockImpl_Header
  03.
  04.#include
  05.#include
  06.#include
  07.#include
  08.
  09.using namespace std;
  10.
  11./*
  12. 读写锁允许当前的多个读用户访问保护资源,但只允许一个写读者访问保护资源
  13.*/
  14.
  15.//-----------------------------------------------------------------
  16.class CRWLockImpl
  17.{
  18.protected:
  19. CRWLockImpl();
  20. ~CRWLockImpl();
  21. void ReadLockImpl();
  22. bool TryReadLockImpl();
  23. void WriteLockImpl();
  24. bool TryWriteLockImpl();
  25. void UnlockImpl();
  26.
  27.private:
  28. void AddWriter();
  29. void RemoveWriter();
  30. DWORD TryReadLockOnce();
  31.
  32. HANDLE m_mutex;
  33. HANDLE m_readEvent;
  34. HANDLE m_writeEvent;
  35. unsigned m_readers;
  36. unsigned m_writersWaiting;
  37. unsigned m_writers;
  38.};
  39.
  40.//-----------------------------------------------------------------
  41.
  42.class CMyRWLock: private CRWLockImpl
  43.{
  44.public:
  45.
  46. //创建读/写锁
  47. CMyRWLock(){};
  48.
  49. //销毁读/写锁
  50. ~CMyRWLock(){};
  51.
  52. //获取读锁
  53. //如果其它一个线程占有写锁,则当前线程必须等待写锁被释放,才能对保护资源进行访问
  54. void ReadLock();
  55.
  56. //尝试获取一个读锁
  57. //如果获取成功,则立即返回true,否则当另一个线程占有写锁,则返回false
  58. bool TryReadLock();
  59.
  60. //获取写锁
  61. //如果一个或更多线程占有读锁,则必须等待所有锁被释放
  62. //如果相同的一个线程已经占有一个读锁或写锁,则返回结果不确定
  63. void WriteLock();
  64.
  65. //尝试获取一个写锁
  66. //如果获取成功,则立即返回true,否则当一个或更多其它线程占有读锁,返回false
  67. //如果相同的一个线程已经占有一个读锁或写锁,则返回结果不确定
  68. bool TryWriteLock();
  69.
  70. //释放一个读锁或写锁
  71. void Unlock();
  72.
  73.private:
  74. CMyRWLock(const CMyRWLock&);
  75. CMyRWLock& operator = (const CMyRWLock&);
  76.};
  77.
  78.inline void CMyRWLock::ReadLock()
  79.{
  80. ReadLockImpl();
  81.}
  82.
  83.inline bool CMyRWLock::TryReadLock()
  84.{
  85. return TryReadLockImpl();
  86.}
  87.
  88.inline void CMyRWLock::WriteLock()
  89.{
  90. WriteLockImpl();
  91.}
  92.
  93.inline bool CMyRWLock::TryWriteLock()
  94.{
  95. return TryWriteLockImpl();
  96.}
  97.
  98.inline void CMyRWLock::Unlock()
  99.{
  100. UnlockImpl();
  101.}
  102.
  103.
  104.#endif
  RWLockImpl.cpp
  01.#include "RWLockImpl.h"
  02.
  03.CRWLockImpl::CRWLockImpl(): m_readers(0), m_writersWaiting(0), m_writers(0)
  04.{
  05. m_mutex = CreateMutex(NULL, FALSE, NULL);
  06. if (m_mutex == NULL)
  07. cout<<"cannot create reader/writer lock"<<endl;
  08.
  09. m_readEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
  10. if (m_readEvent == NULL)
  11. cout<<"cannot create reader/writer lock"<<endl;
  12.
  13. m_writeEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
  14. if (m_writeEvent == NULL)
  15. cout<<"cannot create reader/writer lock"<<endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值