首页 > 解决方案 > 在多线程环境中将参数(包括 std::function)传递给构造函数的最有效方法

问题描述

多线程程序类似于以下内容:

struct Timer {
   Timer (boost::asio::io_service& ios) : timer_{ios} {}
   boost::asio::steady_timer timer_;
};

struct TimerContext {
   void                *ctxt_{nullptr};
   void                *cookie_{nullptr};
   TimerEventCallback   teCallback_{nullptr};
};

class A {
   std::function<void(Timer *, const TimerContext&)>    callback_;
   int                                                  id_;
   std::string                                          name_;
   boost::asio::io_service                              ios_;
   std::thread                                          thread_;
};

A的构造函数:

A::A (std::function<void(Timer *, const TimerContext&)> cb, int id, std::string name) :
   callback_{cb},
   id_{id},
   name_{name}
{
   thread_ = std::thread{[this] () {
         // some code
      }
   };
}

回调函数定义(截至目前的免费函数,由我编写):

void
customCallback (Timer *timer, const TimerContext& ctxt) {
   log << __func__ << "timer id: " << (void *)timer;

   auto ret = ctxt.teCallback_(timer, ctxt.cookie_);

   log << __func__ << ret;
}

在 main() 中,

for (int i = 0; i < 5; ++i) {
   int id = getId(i);
   std::string name = getName(i);

   A *a = new A{customCallback, id, name};

   vectorA.push_back(a);

}

我可以想到两种方法:

  1. 按值传递构造函数参数,然后将std::move它们传递到构造函数初始值设定项列表中。
A *a = new A{customCallback, id, name};

A::A (std::function<void(Timer *, const TimerContext&)> cb, int id, std::string name) :
   callback_{std::move(cb)},
   id_{std::move(id)},
   name_{std::move(name)}
  1. 通过const引用传递构造函数参数,然后允许副本出现在构造函数初始值设定项列表中。
A *a = new A{customCallback, id, name};

A::A (const std::function<void(Timer *, const TimerContext&)> &cb, const int &id, const std::string &name) :
   callback_{cb},
   id_{id},
   name_{name}

哪一个在复制和性能方面更有效?如果有更好的方法(直到并包括c++14),请提出建议。

标签: c++multithreadingc++11c++14

解决方案


推荐阅读