Como inicial membro estático em C ++ usando a função

votos
0

Eu estou usando C ++.

em .h:

static CRITICAL_SECTION g_CS;

em .cpp:

CRITICAL_SECTION CQCommon::g_CS;

mas eu quero usar

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

em uma função estática. Como posso chamar InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Posso usar o seguinte:

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

E como eu posso invocar DeleteCriticalSection(&g_CS)após a licença de aplicativo?

Usando MFC, parece CCriticalSection é uma solução.

Publicado 27/08/2009 em 02:37
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

Se você quer uma abordagem diferente, você pode criar um objeto para controlá-lo:

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

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

Este será agora gerida automaticamente pelo C ++. A seção crítica será inicializado quando a função é inserida em primeiro lugar, e excluídos quando o programa termina.

Além disso é possível estender esta, tendo a variável real PCRITICAL_SECTION dentro da classe, etc .. etc ..

Respondeu 27/08/2009 em 02:49
fonte usuário

votos
1

Bem, hoje a melhor prática é usar o "escopo de bloqueio" padrão em vez de EnterXXX e funções LeaveXX -como. Dê uma olhada no que vaias tem para oferecer. Independentemente disso, uma abordagem RAII pode ajudá-lo aqui:

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);
   }
}
Respondeu 27/08/2009 em 02:56
fonte usuário

votos
1

No ponto de entrada para o seu código - a função principal, chamar a inicialização:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
Respondeu 27/08/2009 em 02:40
fonte usuário

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