⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osmutexrw.cpp

📁 跨操作系统的微型中间件
💻 CPP
字号:
/*    File:       OSMutex.cpp    Contains:       */#include "OSMutexRW.h"#include "OSMutex.h"#include "OSCond.h"#include <stdlib.h>#include <string.h>#if DEBUGMUTEXRW    int OSMutexRW::fCount = 0;    int OSMutexRW::fMaxCount =0;#endif    #if DEBUGMUTEXRWvoid OSMutexRW::CountConflict(int i)            {    fCount += i;    if (i == -1) qtss_printf("Num Conflicts: %d\n", fMaxCount);    if (fCount > fMaxCount)    fMaxCount = fCount;}#endifvoid OSMutexRW::LockRead(){    OSMutexLocker locker(&fInternalLock);#if DEBUGMUTEXRW    if (fState != 0)     {   qtss_printf("LockRead(conflict) fState = %d active readers = %d, waiting writers = %d, waiting readers=%d\n",fState,  fActiveReaders, fWriteWaiters, fReadWaiters);        CountConflict(1);      } #endif        AddReadWaiter();    while   (   ActiveWriter() // active writer so wait            ||  WaitingWriters() // reader must wait for write waiters            )    {           fReadersCond.Wait(&fInternalLock,OSMutexRW::eMaxWait);    }            RemoveReadWaiter();    AddActiveReader(); // add 1 to active readers    fActiveReaders = fState;    #if DEBUGMUTEXRW//  qtss_printf("LockRead(conflict) fState = %d active readers = %d, waiting writers = %d, waiting readers=%d\n",fState,  fActiveReaders, fWriteWaiters, fReadWaiters);#endif}void OSMutexRW::LockWrite(){    OSMutexLocker locker(&fInternalLock);    AddWriteWaiter();       //  1 writer queued            #if DEBUGMUTEXRW    if (Active())     {   qtss_printf("LockWrite(conflict) state = %d active readers = %d, waiting writers = %d, waiting readers=%d\n", fState, fActiveReaders, fWriteWaiters, fReadWaiters);        CountConflict(1);      }    qtss_printf("LockWrite 'waiting' fState = %d locked active readers = %d, waiting writers = %d, waiting readers=%d\n",fState, fActiveReaders, fReadWaiters, fWriteWaiters);#endif    while   (ActiveReaders())  // active readers    {               fWritersCond.Wait(&fInternalLock,OSMutexRW::eMaxWait);    }    RemoveWriteWaiter(); // remove from waiting writers    SetState(OSMutexRW::eActiveWriterState);    // this is the active writer        fActiveReaders = fState; #if DEBUGMUTEXRW//  qtss_printf("LockWrite 'locked' fState = %d locked active readers = %d, waiting writers = %d, waiting readers=%d\n",fState, fActiveReaders, fReadWaiters, fWriteWaiters);#endif}void OSMutexRW::Unlock(){               OSMutexLocker locker(&fInternalLock);#if DEBUGMUTEXRW//  qtss_printf("Unlock active readers = %d, waiting writers = %d, waiting readers=%d\n", fActiveReaders, fReadWaiters, fWriteWaiters);#endif    if (ActiveWriter())     {                   SetState(OSMutexRW::eNoWriterState); // this was the active writer         if (WaitingWriters()) // there are waiting writers        {   fWritersCond.Signal();        }        else        {   fReadersCond.Broadcast();        }#if DEBUGMUTEXRW        qtss_printf("Unlock(writer) active readers = %d, waiting writers = %d, waiting readers=%d\n", fActiveReaders, fReadWaiters, fWriteWaiters);#endif    }    else    {        RemoveActiveReader(); // this was a reader        if (!ActiveReaders()) // no active readers        {   SetState(OSMutexRW::eNoWriterState); // this was the active writer now no actives threads            fWritersCond.Signal();        }     }    fActiveReaders = fState;}// Returns true on successful grab of the lock, false on failureint OSMutexRW::TryLockWrite(){    int    status  = EBUSY;    OSMutexLocker locker(&fInternalLock);    if ( !Active() && !WaitingWriters()) // no writers, no readers, no waiting writers    {        this->LockWrite();        status = 0;    }    return status;}int OSMutexRW::TryLockRead(){    int    status  = EBUSY;    OSMutexLocker locker(&fInternalLock);    if ( !ActiveWriter() && !WaitingWriters() ) // no current writers but other readers ok    {        this->LockRead();         status = 0;    }        return status;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -