c++ - 类似于嵌套互斥体但更通用的东西?

标签 c++ boost stl

我正在处理一个项目,在对类的成员对象执行某些操作后必须保存一个文件。有时我们希望在一次操作后保存文件,有时我们需要在执行了一批操作之后才保存它。

我的想法是使用一个基本上像递归互斥锁一样工作的类。除了不锁定和解锁互斥锁,我希望类在堆栈中类的最后一个实例超出范围时调用一个方法(在本例中为保存文件)。

实现一个执行此操作的类不是问题,但这感觉像是我在 Boost 或 STL 中找不到的一般问题。这个问题是否有预先存在的标准解决方案,或者我需要推出自己的类(class)来解决这个问题?如果是这样,我的方法是否正确,或者是否有更好的方法来解决问题?

下面是我正在寻找的那种行为的简单实现。它只会打印“Hello World!”两次,即使 DoItOnce() 被调用了 11 次。我想通过从公认的标准中提取类似 GenericGuard 的东西来使用它,而不是将我自己的实现粘贴到代码库中。这可能吗?

#include <iostream>

void Noop (void) { }
void HelloWorld (void) { std::cout << "Hello World!" << std::endl; }

// This is what I imagine a generic implementation would look like...
template <void (*InitFunc)(), void (*DestructFunc)()>
class GenericGuard
{
  int & _i;
  public:
  GenericGuard (int & i) : _i(i) { if (_i++ == 0) { InitFunc(); } }
  ~GenericGuard () { if (--_i == 0) { DestructFunc(); } }
};

int HelloWorldCounter; // Use a factory class in real-world?

typedef GenericGuard<Noop, HelloWorld> HelloWorldGuard;

void DoSomethingOnce (void) 
{
  HelloWorldGuard G (HelloWorldCounter);
  // Do something
}

void DoItTenTimes (void)
{
  HelloWorldGuard G (HelloWorldCounter);
  for (int i = 0; i < 10; ++i)
  {
    DoSomethingOnce();
  }
}

int main (void)
{
  DoSomethingOnce();

  DoItTenTimes();

  return 0;
}

最佳答案

您可以将 shared_ptr 与自定义删除函数一起使用。

示例:

#include <memory>
#include <iostream>

void    HelloWorld(void *) { std::cout << "Hello World!" << std::endl; }

class   factory
{
public:
  static std::shared_ptr<void> get_instance()
  {
    static std::weak_ptr<void>   ref;
    if (ref.expired())
      {
        std::shared_ptr<void>    sp{nullptr, HelloWorld};
        ref = sp;
        return sp;
      }
    return ref.lock();
  }

};

void DoSomethingOnce (void)
{
  std::shared_ptr<void>  G = factory::get_instance();
  // Do something
}

void DoItTenTimes (void)
{
  std::shared_ptr<void>  G = factory::get_instance();
  for (int i = 0; i < 10; ++i)
    {
      DoSomethingOnce();
    }
}

int     main(void)
{
  DoSomethingOnce();

  DoItTenTimes();

  return 0;
}

关于c++ - 类似于嵌套互斥体但更通用的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24389379/

相关文章:

c++ - CudaMalloc 分配内存时失败

c++ - 严格指针别名 : is access through a 'volatile' pointer/reference a solution?

C++ while 循环不按预期/希望的方式运行

c++ - 不能为对象的 shared_ptr 的 vector 调用没有对象的成员函数

c++ - 声明 unsigned int 和数组(将具有不同大小)的 unordered_map?

c++ - priority_queue 在 Debug模式下变得非常慢

c++ - 没有卡尔曼滤波器的 BackgroundSubtractorGMG?

c++ - Boost FFT 示例 - 编译时出错,这段代码在做什么?

c++ - 如何使用 boost::enable_if 定义部分特化模板类的成员函数

c++ - Const Rvalue 引用以捕获不应编译的重载