3

由于锁定,我的代码面临性能问题。请参见下面的草图(无论如何不能发布太大的实际代码):

XYZ::process()
{
  ...
  lock();
  processSharedData(id );
  unlock();
  ...
}

XYZ::processSharedData(obj id)
{
  obj a = accessDataAttr1(id);
  //do some integrity checks

  //evaluate some conditions and then
  func1(attr1, attr2, attr3, ...);

  obj b = accessDataAttr2(id);
  //do some integrity checks

  //evaluate some conditions and then
  func2(attr1, attr2, attr3, ...);

  obj c = accessDataAttr3(id);
  //do some integrity checks

  //evaluate some conditions and then
  func3(attr1, attr2, attr3, ...);

  //do some clean up
  return;
}

现在我想将 func1、func2 和 func3 从锁定/解锁范围中移出。请提出有效的方法。有没有办法用它的参数存储函数调用以便以后调用它?

将所有参数存储在成员结构中并将函数指针存储在 std::list 中怎么样?

编辑:

很抱歉在我还没有 c++11 之前没有提到这一点。任何没有 std:function 和 std:bind 的解决方案现在都很好。

4

2 回答 2

5

确保您可以这样做:

typedef std::vector<std::function<void(void)>> f_list;

XYZ::process() {
  //our function list
  f_list fl;
  lock();
  fl=processSharedData(id );
  unlock();
  //invoke functions
  for(auto& f : fl) f();
}

f_list XYZ::processSharedData(obj id) {
  f_list fl;
  obj a = accessDataAttr1(id);
  //do some integrity checks

  fl.push_back(
       std::bind(&func1, attr1, attr2, attr3)
  );

  obj b = accessDataAttr2(id);
  //do some integrity checks

  //evaluate some conditions and then
  fl.push_back(
       std::bind(&func2, attr1, attr2, attr3)
  );
  //and so on
  return fl;
}

参考

http://en.cppreference.com/w/cpp/utility/functional/bind

http://en.cppreference.com/w/cpp/utility/functional/function

http://en.cppreference.com/w/cpp/container/vector

于 2012-10-28T12:18:07.677 回答
4

要基于 111111 的答案,如果要调用的函数是XYZ类中的成员函数,则必须将实例作为第一个参数传递:

fl.push_back(
    std::bind(&func1, this, attr1, attr2, attr3)
);

稍后当您调用函数时,您可以使用 C++11 中的另一个新功能:基于范围的 for 循环

for (auto f : fl)
    f();
于 2012-10-28T12:22:49.840 回答