📄 osmutexrw.h
字号:
/* File: OSMutexRW.h Contains: */#ifndef _OSMUTEXRW_H_#define _OSMUTEXRW_H_#include <stdlib.h>#include "OSHeaders.h"#include "OSThread.h"#include "MyAssert.h"#include "OSMutex.h"//#include "OSQueue.h"#define DEBUGMUTEXRW 0class OSMutexRW{ public: OSMutexRW(): fState(0), fWriteWaiters(0),fReadWaiters(0),fActiveReaders(0) {} ; void LockRead(); void LockWrite(); void Unlock(); // Returns 0 on success, EBUSY on failure int TryLockWrite(); int TryLockRead(); private: enum {eMaxWait = 0x0FFFFFFF, eMultiThreadCondition = true, }; enum {eActiveWriterState = -1, eNoWriterState = 0 }; OSMutex fInternalLock; // the internal lock OSCond fReadersCond; // the waiting readers OSCond fWritersCond; // the waiting writers int fState; // -1:writer,0:free,>0:readers int fWriteWaiters; // number of waiting writers int fReadWaiters; // number of waiting readers int fActiveReaders; // number of active readers = fState >= 0; inline void AdjustState(int i) { fState += i; }; inline void AdjustWriteWaiters(int i) { fWriteWaiters += i; }; inline void AdjustReadWaiters(int i) { fReadWaiters += i; }; inline void SetState(int i) { fState = i; }; inline void SetWriteWaiters(int i) { fWriteWaiters = i; }; inline void SetReadWaiters(int i) { fReadWaiters = i; }; inline void AddWriteWaiter() { AdjustWriteWaiters(1); }; inline void RemoveWriteWaiter() { AdjustWriteWaiters(-1); }; inline void AddReadWaiter() { AdjustReadWaiters(1); }; inline void RemoveReadWaiter() { AdjustReadWaiters(-1); }; inline void AddActiveReader() { AdjustState(1); }; inline void RemoveActiveReader() { AdjustState(-1); }; inline Bool WaitingWriters() {return (Bool) (fWriteWaiters > 0) ; } inline Bool WaitingReaders() {return (Bool) (fReadWaiters > 0) ;} inline Bool Active() {return (Bool) (fState != 0) ;} inline Bool ActiveReaders() {return (Bool) (fState > 0) ;} inline Bool ActiveWriter() {return (Bool) (fState < 0) ;} // only one #if DEBUGMUTEXRW static int fCount, fMaxCount; static OSMutex sCountMutex; void CountConflict(int i); #endif};class OSMutexReadWriteLocker{ public: OSMutexReadWriteLocker(OSMutexRW *inMutexPtr): fRWMutexPtr(inMutexPtr) {}; ~OSMutexReadWriteLocker() { if (fRWMutexPtr != NULL) fRWMutexPtr->Unlock(); } void UnLock() { if (fRWMutexPtr != NULL) fRWMutexPtr->Unlock(); } void SetMutex(OSMutexRW *mutexPtr) {fRWMutexPtr = mutexPtr;} OSMutexRW* fRWMutexPtr;}; class OSMutexReadLocker: public OSMutexReadWriteLocker{ public: OSMutexReadLocker(OSMutexRW *inMutexPtr) : OSMutexReadWriteLocker(inMutexPtr) { if (OSMutexReadWriteLocker::fRWMutexPtr != NULL) OSMutexReadWriteLocker::fRWMutexPtr->LockRead(); } void Lock() { if (OSMutexReadWriteLocker::fRWMutexPtr != NULL) OSMutexReadWriteLocker::fRWMutexPtr->LockRead(); } };class OSMutexWriteLocker: public OSMutexReadWriteLocker{ public: OSMutexWriteLocker(OSMutexRW *inMutexPtr) : OSMutexReadWriteLocker(inMutexPtr) { if (OSMutexReadWriteLocker::fRWMutexPtr != NULL) OSMutexReadWriteLocker::fRWMutexPtr->LockWrite(); } void Lock() { if (OSMutexReadWriteLocker::fRWMutexPtr != NULL) OSMutexReadWriteLocker::fRWMutexPtr->LockWrite(); }};#endif //_OSMUTEX_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -