如何避免在调用异步函数进行 lambda 回调时出现额外的副本
how to avoid the extra copy when calling async function taking a lambda callback
我有一个异步函数foo_async
,它接受回调(lambda)并在按值捕获后在新线程上执行它。
void foo_async(const std::function<void()>& callback)
{
std::thread t([callback]() // capture callback by value
{
callback();
});
t.detach();
}
我在函数bar
中使用它,它本身需要回调
void bar(const std::function<void()>& callback)
{
auto barCallback = [callback] // capture original callback by value
{
callback();
std::cout << "world" << std::endl;
};
foo_async(barCallback);
}
最后,我从main
中调用bar
int main()
{
std::string s("hello ");
bar([s]{ std::cout << s; }); // capture some state
std::cin.get();
}
我遇到的问题是main
中的字符串s
被复制了三次,一次在main
,一次在bar
,一次在foo_async
。但理想情况下,只需要复制它两次 - main
将其放入 lambda 中,foo_async
在另一个线程上执行。应该避免bar
中的复制,因为它是同步执行的。
有什么方法可以避免s
的额外副本吗?请注意,我无法通过 bar 中的引用捕获原始回调,因为foo_async需要在新线程上执行它。
你可以尝试两件事:1)不要保留lambda的本地副本,2)将函数对象移动到lambdas中:
void foo_async(std::function<void()> callback)
{
std::thread([c = std::move(callback)]() { c(); }).detach();
}
void bar(std::function<void()> callback)
{
foo_async([c = std::move(callback)]() { c(); std::cout << "worldn"; });
}
int main()
{
std::string s("hello ");
bar([s = std::move(s)]{ std::cout << s; });
}
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- 如何避免在调用异步函数进行 lambda 回调时出现额外的副本