Как инициализировать статический член в C ++, используя функцию - PullRequest
0 голосов
/ 27 августа 2009

Я использую C ++.

в .h:

static CRITICAL_SECTION g_CS;

в .cpp:

CRITICAL_SECTION CQCommon::g_CS;

но я хочу использовать

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

в одной статической функции. Как я могу вызвать InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Могу ли я использовать следующее:

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

А как я могу вызвать DeleteCriticalSection(&g_CS) после выхода из приложения?

При использовании MFC кажется, что CCriticalSection - это решение.

Ответы [ 3 ]

8 голосов
/ 27 августа 2009

Если вам нужен другой подход, вы можете создать объект для управления им:

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

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

Теперь это будет управляться автоматически C ++. Критический раздел будет инициализирован при первом входе в функцию и удален при выходе из программы.

Более того, вы можете расширить это, имея фактическую переменную PCRITICAL_SECTION внутри класса и т. Д. И т. Д.

1 голос
/ 27 августа 2009

Что ж, сегодня лучшая практика заключается в использовании шаблона «scoped lock» вместо функций, подобных EnterXXX и LeaveXX. Посмотрите, что может предложить Боос. Несмотря на это, подход RAII может помочь вам здесь:

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);
   }
}
1 голос
/ 27 августа 2009

В точке ввода вашего кода - основная функция, вызовите init:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
...