首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxCpp RAII可观察订阅

RxCpp RAII可观察订阅
EN

Stack Overflow用户
提问于 2018-02-11 02:31:07
回答 1查看 306关注 0票数 5

我在模型视图设置中使用RxCpp。视图更新方法订阅一个可观察对象(通过lambda捕获this)。如果订阅的存留时间超过视图实例,则会发生未定义的内存访问。我不希望订阅使视图保持活动状态。因此,我需要订阅在视图的析构函数上确定性地结束。这听起来像是RAII的案子。

这是危险的吗?这是对rx的滥用吗?我已经阅读了在类似的设置中首选take_until。为什么这可能会更好,它如何在这里使用?

谢谢!

代码语言:javascript
复制
#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;
};
EN

回答 1

Stack Overflow用户

发布于 2021-09-29 13:56:27

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

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

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

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

或者,使用mutexcondition_variable (使用finally()condition_variable发送信号)可能需要更长的等待时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48724201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档