Jon*_*ake 5 c++ raii model-view rxcpp
我在模型视图设置中使用 RxCpp。视图更新方法订阅可观察对象(通过 lambda 捕获this)。如果订阅的寿命比视图实例的寿命长,就会发生未定义的内存访问。我不希望订阅使视图保持活动状态。因此,我需要订阅在视图的析构函数上确定地结束。这听起来像是 RAII 的一个例子。
这有危险吗?这是否是对 rx 的滥用?我读过的书更喜欢take_until类似的环境。为什么这样会更好,以及如何在这里使用它?
谢谢你!
#include "rxcpp/rx.hpp"
class MyView : public View
{
public:
MyView(rxcpp::observable<int> obs) : obs (obs)
{
sub = obs.subscribe ([this] (int i) { update(i); });
}
~MyView()
{
sub.unsubscribe();
}
void update(int i)
{
number = i;
repaint();
}
private:
rxcpp::observable<int> obs;
rxcpp::subscription sub;
int number;
};
Run Code Online (Sandbox Code Playgroud)
take_until是在其之后组成下一个动作时的最佳答案。这将确保正确的排序。
问题是取消总是一场竞赛。问题中的代码unsubscribe()在析构函数中执行,然后开始取消竞争。然而,析构函数不会等到订阅结束。this这会在析构函数的退出和预期有效的订阅结束之间留下竞争。
解决方案是在 后添加某种等待unsubscribe()。
finally()这可能是在构造函数中原始订阅的a 中设置的原子 bool 上的忙等待。
mutex或者使用 a和 a condition_variable(用于finally()发出 信号)可能会导致更严重的等待condition_variable。