Avatar billede m_soerensen Nybegynder
18. januar 2006 - 13:01 Der er 1 kommentar og
1 løsning

Singleton og semafor

jeg bruger adodb til at få adgang til en database i klassen OdbcConnect som er en singleton.

jeg vil gerne have OdbcConnect til at være tråd sikker.

derfor har jeg overvejet at bruge semaforer til at styre det
jeg har oprettet to klasser CMutex og CSemaphore.

problemet er at jeg ikke kan få de til at virke jeg tror det er fordi jeg ikke kender nok til semaforer.
det jeg leder efter er hvad jeg skal skrive for at kunne låse når en tråd har fat i min instance og låse op når de er færdig med at bruge den.

det med at låse op kunne jeg godt tænke mig var en seperat funktion.

jeg lister koden til de forskellige klasser herunder.

// Mutex.h: interface for the CMutex class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MUTEX_H__2F333AA9_A907_47A9_BC2C_FEAEE32E945D__INCLUDED_)
#define AFX_MUTEX_H__2F333AA9_A907_47A9_BC2C_FEAEE32E945D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMutex 
{
public:
    CMutex(void);
    void Lock(void);
    void Unlock(void);
    virtual ~CMutex();

private:
    CRITICAL_SECTION lock;

};

#endif // !defined(AFX_MUTEX_H__2F333AA9_A907_47A9_BC2C_FEAEE32E945D__INCLUDED_)

// Mutex.cpp: implementation of the CMutex class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "inropabasic.h"
#include "Mutex.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMutex::CMutex(void)
{
    InitializeCriticalSection(&lock);
}


CMutex::~CMutex()
{

}


void CMutex::Lock(void)
{
    EnterCriticalSection(&lock);
}
   
void CMutex::Unlock(void)
{
    LeaveCriticalSection(&lock);
}

// Semaphore.h: interface for the CSemaphore class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SEMAPHORE_H__F0DE8522_7D4C_4F14_AEB3_47B723109F3F__INCLUDED_)
#define AFX_SEMAPHORE_H__F0DE8522_7D4C_4F14_AEB3_47B723109F3F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CSemaphore 
{
public:
private:
    HANDLE csemaphore;
public:
    CSemaphore(void);
    CSemaphore(int available);
    void Wait(void);
    void Post(void);
    void Post(int how_many);
    virtual ~CSemaphore();

};

#endif // !defined(AFX_SEMAPHORE_H__F0DE8522_7D4C_4F14_AEB3_47B723109F3F__INCLUDED_)

// Semaphore.cpp: implementation of the CSemaphore class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "inropabasic.h"
#include "Semaphore.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSemaphore::CSemaphore()
{
    CreateSemaphore(0, 0, 0x7ffffff, 0);

}

CSemaphore::~CSemaphore()
{
    CloseHandle(csemaphore);

}


CSemaphore::CSemaphore(int available)
{
    CreateSemaphore(0, available, 0x7ffffff, 0);
}

void CSemaphore::Wait(void)
{
    WaitForSingleObject(csemaphore, INFINITE);
}

void CSemaphore::Post(void)
{
    ReleaseSemaphore(csemaphore, 1, 0);
}

void CSemaphore::Post(int how_many)
{
    ReleaseSemaphore(csemaphore, how_many, 0);
}


herunder er koden til min getinstance metode:

OdbcConnect* OdbcConnect::getInstance(CString dbPath)
{

   
   
    if(instance==NULL||dbPath!=newPath)
    {
        if(instance!=NULL&&dbPath!=newPath)
            instance->Release();
       
        instance = new OdbcConnect();
        instance->setProjectDB(dbPath);
        if(!instance->open("Admin","inropa"))
            AfxMessageBox("ingen forbindelse til Databasen");

    }

    return instance;
}
Avatar billede m_soerensen Nybegynder
19. januar 2006 - 10:13 #1
svaret er fundet for at bruge semafor og mutex i getinstance er de nødt til at være static variable
Avatar billede m_soerensen Nybegynder
19. januar 2006 - 10:17 #2
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester