Comment initiale organe statique en C ++ en utilisant la fonction

voix
0

J'utilise C ++.

en .h:

static CRITICAL_SECTION g_CS;

en .cpp:

CRITICAL_SECTION CQCommon::g_CS;

mais je veux utiliser

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

dans une fonction statique. Comment puis - je appeler InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Puis-je utiliser celui qui suit:

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

Et comment puis - je invoquer DeleteCriticalSection(&g_CS)après le congé de l' application?

En utilisant MFC, il semble CCriticalSection est une solution.

Créé 27/08/2009 à 02:37
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
8

Si vous voulez une approche différente, vous pouvez créer un objet pour le gérer:

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

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

Ce sera désormais géré automatiquement par C ++. La section critique sera initialisé lorsque la fonction est d'abord entré, et supprimé lorsque le programme se termine.

En outre, vous pouvez étendre en ayant la variable PCRITICAL_SECTION réelle à l'intérieur de la classe, etc .. etc ..

Créé 27/08/2009 à 02:49
source utilisateur

voix
1

Eh bien, aujourd'hui, la meilleure pratique consiste à utiliser modèle « scope de verrouillage » au lieu de EnterXXX et les fonctions de LeaveXX. Jetez un oeil à ce que Boos a à offrir. Quoiqu'il en soit, une approche RAII peut vous aider ici:

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);
   }
}
Créé 27/08/2009 à 02:56
source utilisateur

voix
1

Dans le point d'entrée à votre code - la fonction principale, appelez init:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
Créé 27/08/2009 à 02:40
source utilisateur

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