如何使用函数在C++中初始化静态成员

use*_*749 0 c++ static critical-section

我正在使用C++.

.h:

static CRITICAL_SECTION g_CS;
Run Code Online (Sandbox Code Playgroud)

.cpp:

CRITICAL_SECTION CQCommon::g_CS;
Run Code Online (Sandbox Code Playgroud)

但我想用

QGUID temp;
EnterCriticalSection(&g_CS);
temp = g_GUID++;
LeaveCriticalSection(&g_CS);
return temp;
Run Code Online (Sandbox Code Playgroud)

在一个静态函数中.我该如何调用InitializeCriticalSection(PCRITICAL_SECTION pcs);

我可以使用以下一个:

QGUID func(XXX)
{
    static {
    InitializeCriticalSection(&g_CS);
    }
                    QGUID temp;
                    EnterCriticalSection(&g_CS);
                    temp = g_GUID++;
                    LeaveCriticalSection(&g_CS);
                    return temp;
}
Run Code Online (Sandbox Code Playgroud)

DeleteCriticalSection(&g_CS)应用程序离开后如何调用?

使用MFC,似乎CCriticalSection是一个解决方案.

Ram*_* B. 8

如果您想要一种不同的方法,您可以创建一个对象来管理它:

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

void Func(void)
{
  static CriticalSectionManager man;
  //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

现在,这将由C++自动管理.首次输入功能时将初始化临界区,并在程序退出时删除.

此外,你可以通过在类等中使用实际的PCRITICAL_SECTION变量来扩展它.等等.

  • 这段代码坏了.C++标准没有说明函数内部静态变量初始化的线程安全性,如果两个线程同时执行Func,你最终可能会初始化man两次. (5认同)