如何在 C++ 中初始化静态成员使用功能

发布于 2024-08-03 15:11:43 字数 864 浏览 8 评论 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是一个解决方案。

I am using C++.

in .h:

static CRITICAL_SECTION g_CS;

in .cpp:

CRITICAL_SECTION CQCommon::g_CS;

but I want to use

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

in one static function.
How can I invoke InitializeCriticalSection(PCRITICAL_SECTION pcs);?

Can I using the following one:

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

And how can I invoke DeleteCriticalSection(&g_CS) after app leave?

Using MFC, it seems CCriticalSection is a solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一笔一画续写前缘 2024-08-10 15:11:43

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

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

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

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

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

If you want a different approach you can create an object to manage it:

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

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

This will now be managed automatically by C++. The critical section will be initialized when the function is first entered, and deleted when the program exits.

Furthermore you can extend this by having the actual PCRITICAL_SECTION variable inside the class, etc.. etc..

深海少女心 2024-08-10 15:11:43

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

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}

In the entry point to your code - the main function, call the init:

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

  // do some stuff

  DeleteCriticalSection(&g_CS);

  // exit
  return 0;
}
像极了他 2024-08-10 15:11:43

那么,今天的最佳实践是使用“范围锁定”模式而不是 EnterXXX 和 LeaveXX 之类的函数。看看 boos 提供了什么。
无论如何,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);
   }
}

Well, today the best practice is to use "scoped lock" pattern instead of EnterXXX and LeaveXX -like functions. Take a look at what boos has to offer.
Regardless, an RAII approach can help you here:

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);
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文