c++ - 在函数退出前调用函数

标签 c++ c++11 boost

我将从一个例子开始。假设我需要在互斥体中保护一个带有函数的代码。有两种实现方法。

#include <iostream>
#include <vector>
#include <pthread.h>



pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
std::vector<float> myVec;

void threadfunc(int i, float value)
{
  pthread_mutex_lock(&myMutex);
  if(i <= 0 || i > myVec.size())
  {
    pthread_mutex_unlock(&myMutex);
    return;
  }

  if(value < 0)
  {
    pthread_mutex_unlock(&myMutex);
    return;
  }

  myVec[i] += value;
  pthread_mutex_unlock(&myMutex);
  return;
}

class AUTOMUTEX
{
  private:
    pthread_mutex_t *mMutex;
  public:
    AUTOMUTEX(pthread_mutex_t *mutex): mMutex(mutex)
  {
    pthread_mutex_lock(mMutex);
  }

    ~AUTOMUTEX()
    {
      pthread_mutex_unlock(mMutex);
    }
};


void threadfunc_autolock(int i, float value)
{
  AUTOMUTEX  autoMutex(&myMutex);
  if(i <= 0 || i > myVec.size())
  {
    return;
  }

  if(value < 0)
  {
    return;
  }

  myVec[i] += value;
  return;
}

int  main()
{
  threadfunc_autolock(5, 10);
  threadfunc(0, 7);
  return 1;
}

从示例中可以清楚地看出,threadfunc autolock 是更好的实现,因为调用 pthread_mutex_unlock 函数返回由对 AUTOMUTEX 的析构函数调用负责(C++ 11 线程支持此功能。因此,如果我们不需要自己实现 AUTOMUTEX正在使用 C++11 线程库)。 每次我们需要使用一些设置/重置函数对执行此操作时,有没有一种方法可以在不实现包装类的情况下实现这一点。 boost 或 C++ 11 是否有一些预定义的模板类,我们可以使用这些模板类为任何此类“设置/重置”功能实现 AUTOMUTEX 的行为。这对于具有多个返回点的函数非常有用。 换句话说,boost/C++ 是否提供了具有以下行为的类。

//sample code not compilable.
template <class T, class Y>
class myAuto
{
  myAuto()
{ 
   T();
}
  ~myAuto()
{
  Y();
};

最佳答案

你可以编写自己的 geneirc RAII 类,比如:

class Finally
{
public:
    explicit Finally(std::function<void()> f) : mF(f) {}
    ~Finally() noexcept() {
        try
        {
            mF();
        } catch (...) {
            // Handle error.
        } 
    }

    Finally(const Finally&) = delete;
    Finally(Finally&&) = delete;

    Finally& operator=(const Finally&) = delete;
    Finally& operator=(Finally&&) = delete;

private:
    std::function<void()> mF;
};

用法:

{
    pthread_mutex_lock(&myMutex);
    Finally finally([&](){ pthread_mutex_unlock(&myMutex); });

    //..
}

即使专用 RAII 对象在某些情况下可能更合适(如 Mutex)。

关于c++ - 在函数退出前调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33031334/

相关文章:

c++ - 将库安装到编译中未包含的路径后编译失败

c++ - 从第 3 方库导出 cpp 损坏的函数

c++ - LoadLibraryA 失败,未找到模块,但文件名正确

c++ - 引用性与模板函数中的类型无关

C++ 创建文件时出错(名称基于其他文件名)

c++ - Boost SSL 编译失败

c++ - 对象数组,C++

c++11 - 类成员初始化的首选方式?

c++ - Boost 链接错误 - 单个 undefined reference

c++ - FFmpeg:如何在从 RTSP 读取时控制控制台输出?