Frage

Ich bin mit C ++.

in .h:

static CRITICAL_SECTION g_CS;

in .cpp:

CRITICAL_SECTION CQCommon::g_CS;

, aber ich möchte verwenden,

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

in einer statischen Funktion. Wie kann ich invoke InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Kann ich folgendes ein mit:

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

Und wie kann ich invoke DeleteCriticalSection(&g_CS) nach App verlassen?

Mit MFC, wie es scheint CCriticalSection eine Lösung ist.

War es hilfreich?

Lösung

Wenn Sie einen anderen Ansatz möchten, können Sie ein Objekt erstellen, um es zu verwalten:

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

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

Dies wird nun automatisch von C ++ verwaltet werden. Der kritische Abschnitt wird initialisiert werden, wenn die Funktion zuerst eingegeben wird, und gelöscht, wenn das Programm beendet wird.

Darüber hinaus können Sie diese erweitern, indem die tatsächliche PCRITICAL_SECTION Variable in der Klasse mit, etc .. etc ..

Andere Tipps

In dem Einstiegspunkt in Ihrem Code - die Hauptfunktion, rufen Sie die init:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}

Nun, heute die beste Praxis ist „scoped lock“ Muster statt EnterXXX und LeaveXX -ähnliche Funktionen zu nutzen. Werfen Sie einen Blick auf das, was Buhrufe zu bieten hat. Unabhängig davon, kann ein RAII Ansatz, den Sie hier helfen:

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);
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top