c++ - 在多线程环境中将参数(包括 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);
}
我可以想到两种方法:
- 按值传递构造函数参数,然后将
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)}
- 通过
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
),请提出建议。
解决方案
推荐阅读
- image - 对 Prestashop 1.7 的 webP 支持
- sql-server - SQL Server 2016+ 更新没有主键的大型数据集
- react-native - React Native - Redux - 冻结 UI
- r - knitr:创建环境以在完成时删除的块之间共享变量
- html - overflow-x 是滚动,overflow-y 是同时覆盖
- angular - ng 部署到 gh-pages:默认页面而不是应用程序
- mysql - 使用 Workbench 从本地计算机连接到 RDS 实例
- git - git commit --fixup hash 什么都不做
- c# - 调整 Chartarea 大小并在 Chart 上添加滚动条(不是 Chartarea)
- flutter - 带有白色数字的 showDateRangePicker