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;
}