0

我正在使用 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 是一个解决方案。

4

3 回答 3

8

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

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

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

这现在将由 C++ 自动管理。临界区将在函数第一次进入时被初始化,并在程序退出时被删除。

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

于 2009-08-27T01:49:54.517 回答
1

在代码的入口点 - 主函数中,调用 init:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
于 2009-08-27T01:40:52.123 回答
1

好吧,今天最好的做法是使用“作用域锁”模式而不是 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);
   }
}
于 2009-08-27T01:56:20.113 回答