Conectar-se
Quem está conectado
20 usuários online :: 1 usuário cadastrado, Nenhum Invisível e 19 Visitantes

Denis Lemos

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
Data de inscrição : 06/10/2010
Número de Mensagens : 84
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Reputação : 3
Ver perfil do usuário

C++ ReaderWriterLock, onde está o erro?

em Qua 12 Mar 2014, 17:34
oi, estou tentando criar um readerwriterlock usando apenas as funções do Windows, porém parece que o "writeLock" só pode ser chamado uma vez (não por vez, mas pela vida do objeto) e não consigo achar o erro.

Código:

struct ReaderWriterLock {
   volatile long readerCount = 0;

   ReaderWriterLock():
      readerLock(CreateEvent(NULL, FALSE, TRUE, NULL)){
      InitializeCriticalSection(&writerLock);
   }

   void readLock(){
      EnterCriticalSection(&writerLock);

      if (InterlockedIncrement(&readerCount) == 1){
         ResetEvent(&readerLock);
      }

      LeaveCriticalSection(&writerLock);
   }

   void readUnlock(){
      EnterCriticalSection(&writerLock);

      if (InterlockedDecrement(&readerCount) == 0)
         SetEvent(&readerLock);

      LeaveCriticalSection(&writerLock);
   }

   // somente chamar writeUnlock depois, não usar readUnlock
   void upgradeLock(){
      if (InterlockedDecrement(&readerCount) == 0)
         EnterCriticalSection(&writerLock);
      else
         writeLock();
   }

   void writeLock(){
      WaitForSingleObject(readerLock, INFINITE);
      EnterCriticalSection(&writerLock);
   }

   void writeUnlock(){
      SetEvent(&readerLock);
      LeaveCriticalSection(&writerLock);
   }

   ~ReaderWriterLock(){
      CloseHandle(readerLock);
      DeleteCriticalSection(&writerLock);
   }


private:
   CRITICAL_SECTION writerLock;
   HANDLE           readerLock;
};

Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum