Jak počáteční statické člen v C ++ pomocí funkce

hlasů
0

Já používám C ++.

v .h:

static CRITICAL_SECTION g_CS;

v .cpp:

CRITICAL_SECTION CQCommon::g_CS;

ale chci použít

QGUID temp;
EnterCriticalSection(&g_CS);
temp = g_GUID++;
LeaveCriticalSection(&g_CS);
return temp;

v jedné statické funkce. Jak mohu uplatnit InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Mohu pomocí následujícího jednu možnost:

QGUID func(XXX)
{
    static {
    InitializeCriticalSection(&g_CS);
    }
                    QGUID temp;
                    EnterCriticalSection(&g_CS);
                    temp = g_GUID++;
                    LeaveCriticalSection(&g_CS);
                    return temp;
}

A jak mohu vyvolat DeleteCriticalSection(&g_CS)po aplikaci dovolené?

Pomocí MFC, zdá CCriticalSection je řešení.

Položena 27/08/2009 v 02:37
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
8

Pokud se chcete jiný přístup, můžete vytvořit objekt jej řídit:

class CriticalSectionManager
{
  public:
  CriticalSectionManager()
  {
    InitializeCriticalSection(&g_CS);
  }
  ~CriticalSectionManager()
  {
     DeleteCriticalSection(&g_CS);
  }
};

void Func(void)
{
  static CriticalSectionManager man;
  //Do stuff
}

To bude automaticky řízena C ++. Kritická část se inicializuje, když poprvé vstoupil funkce, a vypouští když program ukončí.

Dále můžete rozšířit tím, že má skutečný PCRITICAL_SECTION proměnná uvnitř třídy, atd .. atd ..

Odpovězeno 27/08/2009 v 02:49
zdroj uživatelem

hlasů
1

No, dnes je nejlepším řešením je použití „rozsahem uzamčení“ vzor místo EnterXXX a LeaveXX-jako funkce. Podívejte se na to, co boos má nabídnout. Bez ohledu na to, přístup RAII vám může pomoci zde:

class MyCriticalSection
{
private: 
    CRITICAL_SECTION m_CS;
public:
    MyCriticalSection()
   {
     ::InitializeCriticalSection(&m_CS);
    }
   ~MyCriticalSection()
   {
     ::DeleteCriticalSection(&m_CS);
   }
   void Lock()
   {
     ::EnterCriticalSection(&m_CS);
   }
   void UnLock()
   {
     ::LeaveCriticalSetion(&m_CS);
   }
}
Odpovězeno 27/08/2009 v 02:56
zdroj uživatelem

hlasů
1

Ve vstupní bod do kódu - hlavní funkce, volání init:

int main(...)
{
  InitializeCriticalSection(&g_CS);

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
Odpovězeno 27/08/2009 v 02:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more