c++ - 使用 boost.signals2 在线程之间传递数据
问题描述
对于这个模棱两可的标题,我深表歉意,但我会在这里尝试进一步详细说明:
我有一个应用程序,其中包括(除其他外)一个控件和 TCP 服务器类。TCP 和控制类之间的通信是通过这个实现完成的:
#include <boost/signals2.hpp>
// T - Observable object type
// S - Function signature
template <class T, typename S> class observer {
using F = std::function<S>;
public:
void register_notifier(T &obj, F f)
{
connection_ = obj.connect_notifier(std::forward<F>(f));
}
protected:
boost::signals2::scoped_connection connection_;
};
// S - Function signature
template <typename S> class observable {
public:
boost::signals2::scoped_connection connect_notifier(std::function<S> f)
{
return notify.connect(std::move(f));
}
protected:
boost::signals2::signal<S> notify;
};
其中 TCP 服务器类是 observable,控制类是观察者。
TCP 服务器运行在与控制类不同的线程上,并使用 boost::asio::async_read。每当收到消息时,服务器对象都会通过'notify'成员发送通知,从而触发控件类中注册的回调,然后等待读取下一条消息。
问题是我需要以某种方式安全有效地存储当前存储在 TCP 服务器缓冲区中的数据,并将其传递给控制类,然后再被下一条消息覆盖。
IE :
inline void ctl::tcp::server::handle_data_read(/* ... */)
{
if (!error) {
/* .... */
notify(/* ? */); // Using a pointer to the buffer
// would obviously fail as it
// is overridden in the next read
}
/* .... */
}
到目前为止,这些是我对解决方案的想法:
- 分配堆内存并使用 unique_ptr 传递指向它的指针,但我不确定 boost.signals2 是否具有移动感知功能。
- 使用无序映射(对象之间共享),将整数索引映射到数据类型的 unique_ptr (
std::unordered_map<int, std::unique_ptr<data_type>>
),然后只传递元素的索引,并在控件类回调中“弹出”它,但感觉就像一个矫枉过正。
我真正想要的是一个简单而有效的解决方案的想法,以在线程之间传递每条消息的 TCP 缓冲区内容。
请注意,如果完全错误,我也愿意接受重新设计对象之间的通信方法的建议。
解决方案
推荐阅读
- android - 一个布局但没有另一个布局的资源未找到异常
- azure-ad-b2c - 能否更改 Azure ADB2C 用户流中电子邮件地址属性的位置?
- python - 仅针对任意类的 Python 类型提示(不是类实例或任何其他非类类型)
- python - 从任务调度程序运行 python 脚本作为任务
- react-native - 异步 redux thunk 需要 wrapoer 函数
- c++ - 类对象 unique_ptr 重置,破坏/构造顺序
- sql - 是否可以定义一个在外键值内自动递增的字段?
- python - 如何在 VScode 和 PyCharm 等 PyGtk 应用程序中实现 Linux 终端?
- f5 - 通过 https url 的 F5 负载均衡器
- linux - 是否可以直接将 photorec 文件输出到 ssh 帐户