【发布时间】:2019-09-14 14:31:10
【问题描述】:
我正在努力正确地使用 boost::function 和 boost::bind 将传递的对象和成员函数绑定到一个 boost::function 中,然后当数据在队列中时调用该函数
我正在研究用于线程间通信的多生产者单消费者队列。基本思想是提供一个模板类。当数据发布到队列中时,订阅者通过回调函数获取数据,该回调函数必须在订阅时提供。
注意:... 表示出于易读性原因我省略了代码的地方
T 是存储在队列中的类型
template <typename T>
class pipeline_mpsc
{...};
订阅功能
template <typename FUNC, class OBJ>
bool subscribe(FUNC fn, OBJ obj)
{
bool loc_return = false;
if (Callback_fn_ == NULL)
{
boost::function<void(const T &)> BoundCallback(boost::bind(fn, obj, _1));
Callback_fn_ = &BoundCallback;
boost::thread th(&pipeline_mpsc::Callbackcaller, this, &BoundCallback); //pipeline.hpp[38, 25]
loc_return = true;
}
return loc_return;
};
void Callbackcaller(boost::function<void(const T &)> *Callback_fn) {
...
Callback_fn(loc_tmp); //pipeline.hpp[96, 18]
};
如何调用订阅函数
laserscan_sub_->subscribe(&LidarFovFilter::laserscan_callback, this); //LidarFovFilter.cpp[25, 73]
回调函数原型
void LidarFovFilter::laserscan_callback(const LaserScan &scan)
当我编译它时,我从 gcc 收到以下错误:
‘Callback_fn’不能用作函数
pipeline.hpp[96, 18]:在“void pipeline_mpsc::Callbackcaller(boost::function) [with T = LaserScan]”的实例化中:
pipeline.hpp[38, 25]: 需要来自'bool pipeline_mpsc::subscribe(FUNC, OBJ) [with FUNC = void (LidarFovFilter::
LidarFovFilter.cpp[25, 73]:这里需要
从我读到的如何使用 boost::bind 和 boost::function 我认为我的代码应该可以工作(但显然它不能工作)。我不知道为什么它不能工作。我的错误在哪里?真的会得到帮助。
【问题讨论】:
-
只是出于好奇:您使用的是 c++11 之前的编译器吗?除非您受到这样的限制,否则使用最新的标准和 lambda 函数会有更好的解决方案。
-
即使没有任何构建错误,它也不会起作用。原因是
&BoundCallback是一个指向 local 对象的指针,该对象将超出范围,并且在线程之前其生命周期结束。 -
@πάνταῥεῖ:谢谢你的提示,我会调查的 :)
-
@Someprogrammerdude: (*Callback_fn)(loc_tmp);处于一个while循环(以及更多)中,我省略了它,因为它不是问题的一部分,但感谢您的反对:)
-
不是真正的“反对”,而是一个严重的问题。在使用
Callback_fn_之前,您保存一个指向其生命周期结束的局部变量的指针。示例:if (some_condition) { int local_variable = 5; my_pointer = &local_variable; } /* PROBLEM AHEAD! local_variable no longer exists and my_pointer is invalid */
标签: c++ templates boost callback