【问题标题】:RxCpp RAII observable subscriptionRxCpp RAII 可观察订阅
【发布时间】:2018-07-21 07:23:53
【问题描述】:

我在模型视图设置中使用 RxCpp。一个视图更新方法订阅了一个 observable(通过 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;
};

【问题讨论】:

  • 我远非专家,但我认为你做的是对的。

标签: c++ raii model-view rxcpp


【解决方案1】:

take_until 是在它之后组成下一个动作时的最佳答案。这将确保正确的排序。

问题是取消总是一场竞赛。问题中的代码在析构函数中执行unsubscribe(),这开始了取消比赛。但是,析构函数不会等到订阅结束。这在析构函数的退出和订阅结束之间留下了竞争,期望this 有效。

解决方案是在unsubscribe() 之后添加某种等待。

这可能是在构造函数中原始订阅的finally() 中设置的原子布尔值的忙等待。

或者,使用mutexcondition_variable(使用finally() 发出condition_variable 的信号)可能会导致更长时间的等待。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2016-06-26
    • 2019-07-10
    • 2019-06-19
    相关资源
    最近更新 更多